Menu
CoddyTech

Boucle de commandes : résumé

Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 54 sur 80.

challenge icon

Défi

Moyen

Termine le gestionnaire de tâches en ajoutant deux commandes de rapport.

  1. Avec "pending", affiche chaque titre de filterTasks(tasks, false).
  2. Avec "summary", appelle printSummary(tasks).

Appuie sur Run Code : avec les entrées pending, summary, quit, la sortie affiche Learn Luau types, Build a task manager et 1/3 tasks done.

Essayez vous-même

-- La structure que suit chaque tâche du gestionnaire
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},
}
-- Créer une tâche avec le prochain id disponible et l’ajouter à la liste
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
-- Marquer la tâche portant cet id comme terminée ; indiquer si elle a été trouvée
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
-- Une nouvelle liste des tâches dont la valeur de done correspond
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
-- Une ligne : combien de tâches sont terminées
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
-- Essayer
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

Toutes les leçons de Introduction à Luau

Entraînez-vous par vous-même : Compilateur Luau en ligne