Integrando todo
Parte de la sección Introducción a Luau del Journey de Lua de Coddy — lección 50 de 73.
Desafío
IntermedioTu editor ya contiene el conjunto de herramientas completo: el tipo Task, el array tasks (tres tareas iniciales), addTask, completeTask, filterTasks y printSummary.
Escribe un bucle de comandos que siga leyendo una línea con io.read() y gestione estos comandos:
add— lee una línea más como el título, llama aaddTaske imprime exactamente:Added task {id}: {title}(usando los campos de la tarea devuelta)done— lee una línea más, conviértela contonumber(...) or 0, llama acompleteTask; imprimeTask {id} completedsi devolviótrue, de lo contrarioNo task with id {id}list— para cada tarea, imprime[x] {title}si está lista, de lo contrario[ ] {title}(nota el espacio)pending— imprime el título de cada tarea no finalizada, usandofilterTaskssummary— llama aprintSummary(tasks)quit— detén el bucle (detenlo también siio.read()devuelvenil)
Pruébalo tú mismo
-- La forma que debe seguir cada tarea en el gestor
type Task = {
id: number,
title: string,
done: boolean,
}
-- La lista de tareas: un 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},
}
-- Construye una tarea tipada con el siguiente id libre e insértala
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 la tarea con el id dado como hecha; informa el éxito
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
-- Recolecta las tareas cuya bandera done coincida en un nuevo {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 un resumen de progreso de una línea
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
-- Escribe el código aquí
-- Bucle de comandos: lee líneas con io.read() hasta "quit" (o nil).
-- Maneja: add (lee title -> `Added task {id}: {title}`),
-- done (read id -> `Task {id} completed` / `No task with id {id}`),
-- list (`[x] {title}` / `[ ] {title}`),
-- pending (títulos de las tareas sin terminar mediante filterTasks),
-- summary (printSummary)
Todas las lecciones de Introducción a Luau
1Primeros pasos con Luau
¿Qué es Luau?¿Por qué usar Luau?Tu primer código en LuauComprobación de tipos y modos de errorRecapitulacion: Introducción a Luau4Trabajando con Funciones
Tipado de Parámetros y Valores de RetornoTipado de Funciones AnónimasFunciones que no Retornan NadaParámetros OpcionalesValores por Defecto en ParámetrosFunciones VariádicasDefinición de Tipos de FuncionesRecapitulaciones: Funciones Tipadas7Proyecto: Gestor de tareas tipado
Proyecto: La forma de la tareaFunción para añadir una tarea2Tipos principales
Tipos básicos: num, str, boolEl tipo 'any': Vía de escapeEl tipo 'unknown'Tipos nulos y opcionalesInferencia de tipos en acciónAnotaciones explícitas de tiposResumen: Práctica de tipos principales5Alias, Uniones e Intersecciones
Alias de tipos para primitivosTipos de uniónTrabajando con tipos de uniónTipos literalesTipos de intersecciónCombinando alias de tiposResumen: Combinaciones avanzadas de tipos3Tablas tipadas: Arrays y Maps
Arrays tipadosAñadir y leer elementos¿Qué es un tipo Map?Declarar y acceder a MapsIterar tablasTablas de forma mixtaArrays tipados multidimensionalestable.unpack y VarargsRecapitulaciones: Arrays y Maps