Собираем всё вместе
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 50 из 73.
Задание
СреднеВ вашем редакторе уже есть полный набор инструментов: тип Task, массив tasks (три начальные задачи), addTask, completeTask, filterTasks и printSummary.
Напишите командный цикл, который непрерывно читает строку с помощью io.read() и обрабатывает следующие команды:
add— прочитайте ещё одну строку в качестве заголовка, вызовитеaddTaskи выведите ровно:Added task {id}: {title}(используя поля возвращенной задачи)done— прочитайте ещё одну строку, преобразуйте её с помощьюtonumber(...) or 0, вызовитеcompleteTask; выведитеTask {id} completed, если она вернулаtrue, иначеNo task with id {id}list— для каждой задачи выведите[x] {title}, если она выполнена, иначе[ ] {title}(обратите внимание на пробел)pending— выведите заголовок каждой незавершенной задачи, используяfilterTaskssummary— вызовитеprintSummary(tasks)quit— остановите цикл (также остановите, еслиio.read()возвращаетnil)
Попробуйте сами
-- Форма, которой должна соответствовать каждая задача в менеджере
type Task = {
id: number,
title: string,
done: boolean,
}
-- Список задач: типизированный массив форм 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},
}
-- Создать типизированную задачу со следующим свободным id и вставить её
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
-- Отметить задачу с данным id как выполненную; сообщить об успехе
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
-- Собрать задачи, чей флаг done совпадает, в новый {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
-- Вывести однострочную сводку прогресса
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
-- Напишите код здесь
-- Цикл команд: читать строки с помощью io.read() до "quit" (или nil).
-- Обработать: add (читать title -> `Added task {id}: {title}`),
-- done (read id -> `Task {id} completed` / `No task with id {id}`),
-- list (`[x] {title}` / `[ ] {title}`),
-- pending (названия незавершённых задач через filterTasks),
-- summary (printSummary)
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции7Проект: Типизированный менеджер задач
Проект: Структура задачиФункция для добавления задачи2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари