Juntando Tudo
Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 50 de 73.
Desafio
MédioSeu editor já contém a caixa de ferramentas completa: o tipo Task, o array tasks (três tarefas iniciais), addTask, completeTask, filterTasks e printSummary.
Escreva um loop de comando que continue lendo uma linha com io.read() e trate estes comandos:
add— leia mais uma linha como o título, chameaddTaske imprima exatamente:Added task {id}: {title}(usando os campos da tarefa retornada)done— leia mais uma linha, converta comtonumber(...) or 0, chamecompleteTask; imprimaTask {id} completedse retornartrue, caso contrárioNo task with id {id}list— para cada tarefa, imprima[x] {title}se estiver concluída, caso contrário[ ] {title}(observe o espaço)pending— imprima o título de cada tarefa não concluída, usandofilterTaskssummary— chameprintSummary(tasks)quit— pare o loop (também pare seio.read()retornarnil)
Experimente você mesmo
-- A forma que toda tarefa no gerenciador deve seguir
type Task = {
id: number,
title: string,
done: boolean,
}
-- A lista de tarefas: um array tipado de formas Task
local tasks: {Task} = {
{id = 1, title = "Learn Luau types", done = false},
{id = 2, title = "Build a task manager", done = false},
{id = 3, title = "Write tests", done = true},
}
-- Constrói uma tarefa tipada com o próximo id livre e a insere
local function addTask(list: {Task}, title: string): Task
local newTask: Task = {
id = #list + 1,
title = title,
done = false,
}
table.insert(list, newTask)
return newTask
end
-- Marca a tarefa com o id dado como concluída; reporta o sucesso
local function completeTask(list: {Task}, id: number): boolean
for _, t in ipairs(list) do
if t.id == id then
t.done = true
return true
end
end
return false
end
-- Coleta as tarefas cuja flag done corresponde em um novo {Task}
local function filterTasks(list: {Task}, done: boolean): {Task}
local result: {Task} = {}
for _, t in ipairs(list) do
if t.done == done then
table.insert(result, t)
end
end
return result
end
-- Imprime um resumo de progresso em uma linha
local function printSummary(list: {Task}): ()
local total = #list
local doneCount = 0
for _, t in ipairs(list) do
if t.done then
doneCount = doneCount + 1
end
end
print(`{doneCount}/{total} tasks done`)
end
-- Escreva o código aqui
-- Loop de comandos: lê linhas com io.read() até "quit" (ou nil).
-- Lida com: add (lê title -> `Added task {id}: {title}`),
-- done (read id -> `Task {id} completed` / `No task with id {id}`),
-- list (`[x] {title}` / `[ ] {title}`),
-- pending (títulos das tarefas não concluídas via filterTasks),
-- summary (printSummary)
Todas as lições de Introdução ao Luau
1Começando com o Luau
O que é Luau?Por que usar Luau?Seu primeiro código em LuauVerificação de tipos e modos de erroRecapitulando: Introdução ao Luau4Trabalhando com Funções
Tipando Parâmetros e Valores de RetornoTipando Funções AnônimasFunções que Não Retornam NadaParâmetros OpcionaisValores Padrão para ParâmetrosFunções VariádicasDefinindo Tipos de FunçõesRecapitulação: Funções Tipadas7Projeto: Gerenciador de Tarefas Tipado
Projeto: O Formato da TarefaFunção para Adicionar uma Tarefa2Tipos Fundamentais
Tipos Básicos: num, str, boolO Tipo 'any': Escape HatchO Tipo 'unknown'Tipos Nil e OpcionaisInferência de Tipos na PráticaAnotações Explícitas de TiposReciclagem: Prática de Tipos Fundamentais5Aliases, Uniões, Interseções
Aliases de Tipos para PrimitivosTipos de UniãoTrabalhando com Tipos de UniãoTipos LiteraisTipos de InterseçãoCombinando Aliases de TiposRecapitulando: Combinações Avançadas de Tipos3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsIterando Sobre TabelasTabelas de Formato MistoArrays Tipados Multidimensionaistable.unpack e VarargsRecapitulando: Arrays e Maps