Menu
CoddyTech

Vòng lặp lệnh: liệt kê và đánh dấu hoàn thành

Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 53 trên 80.

challenge icon

Thử thách

Trung bình

Thêm một lệnh để liệt kê các nhiệm vụ và một lệnh để hoàn thành chúng.

  1. Khi nhận "list", in từng nhiệm vụ dưới dạng `[x] {t.title}` nếu đã hoàn thành, nếu không thì in `[ ] {t.title}`.
  2. Khi nhận "done", đọc local id: number = tonumber(io.read()) or 0; in `Task {id} completed` nếu completeTask(tasks, id) là true, nếu không thì in `No task with id {id}`.

Nhấn Run Code: với đầu vào done, 2, quit, đầu ra sẽ hiển thị Task 2 completed.

Tự làm thử

-- Cấu trúc chung của mọi tác vụ trong trình quản lý
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},
}
-- Tạo tác vụ với id chưa dùng tiếp theo và thêm vào danh sách
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
-- Đánh dấu tác vụ có id này là hoàn thành; cho biết có tìm thấy tác vụ đó không
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
-- Danh sách mới gồm các tác vụ có giá trị done trùng khớp
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
-- Một dòng: số tác vụ đã hoàn thành
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
-- Thử chạy nhé
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}`)
    end
end

Tất cả bài học trong Giới thiệu về Luau

Tự luyện tập: Trình biên dịch Luau online