Menu
CoddyTech

Цикл команд: сводка

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 54 из 80.

challenge icon

Задание

Средне

Заверши менеджер задач, добавив две команды для отчётов.

  1. При команде "pending" выведи заголовок каждой задачи из filterTasks(tasks, false).
  2. При команде "summary" вызови printSummary(tasks).

Нажми Run Code: при вводе pending, summary, quit вывод содержит Learn Luau types, Build a task manager и 1/3 tasks done.

Попробуйте сами

-- Структура, которой соответствует каждая задача в менеджере
type Task = {
    id: number,
    title: string,
    done: boolean,
}
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
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 doneCount = 0
    for _, t in ipairs(list) do
        if t.done then
            doneCount += 1
        end
    end
    print(`{doneCount}/{#list} tasks done`)
end
-- Попробовать в действии
while true do
    local command = io.read()
    if command == nil or command == "quit" then
        break
    elseif command == "add" then
        local title = io.read()
        local added: Task = addTask(tasks, title)
        print(`Added task {added.id}: {added.title}`)
    elseif command == "list" then
        for _, t in ipairs(tasks) do
            if t.done then
                print(`[x] {t.title}`)
            else
                print(`[ ] {t.title}`)
            end
        end
    elseif command == "done" then
        local id: number = tonumber(io.read()) or 0
        if completeTask(tasks, id) then
            print(`Task {id} completed`)
        else
            print(`No task with id {id}`)
        end
    end
end

Все уроки раздела Введение в Luau

Потренируйтесь самостоятельно: Онлайн-компилятор Luau