Menu
CoddyTech

Hàm ẩn danh

Thuộc phần Logic và luồng chương trình trong hành trình Lua của Coddy. Bài học 13 trên 54.

Giờ đây, khi đã hiểu hàm (function) có thể được lưu trong biến và truyền qua lại, bạn có thể viết hàm ngắn gọn hơn nữa. Thay vì luôn đặt tên cho hàm, bạn có thể tạo hàm ngay tại nơi cần dùng. Những hàm này được gọi là hàm ẩn danh.

Hàm ẩn danh là hàm không có tên. Bạn định nghĩa hàm này bằng từ khóa function, theo sau ngay là các tham số và phần thân hàm:

function(a, b)
    return a + b
end

Cách này tạo ra một giá trị hàm có thể dùng ngay. Hàm ẩn danh đặc biệt hữu ích khi truyền hàm làm đối số cho các hàm khác. Bạn còn nhớ ví dụ sắp xếp tùy chỉnh ở phần trước không? Đây là cách viết ví dụ đó bằng hàm ẩn danh:

local players = {
    {name = "Alice", score = 150},
    {name = "Bob", score = 200},
    {name = "Charlie", score = 175}
}

table.sort(players, function(a, b)
    return a.score > b.score
end)

Thay vì định nghĩa một hàm có tên riêng để so sánh, hàm được tạo trực tiếp làm đối số thứ hai cho table.sort(). Cách này giúp đoạn code gọn hơn và giữ logic sắp xếp ngay tại nơi sử dụng.

challenge icon

Thử thách

Dễ

Viết một hàm filterByThreshold nhận numbers và threshold, rồi trả về một bảng mới chỉ chứa các số lớn hơn ngưỡng.

Trình soạn thảo đã có hàm hỗ trợ filter(list, keep): hàm này gọi keep(value) với từng giá trị và trả về một bảng mới chứa các giá trị mà keep trả về true. Hãy gọi filter và truyền điều kiện kiểm tra dưới dạng một hàm ẩn danh, viết trực tiếp trong lời gọi, giống như cách bài học truyền một hàm vào table.sort(). Đừng lưu điều kiện kiểm tra vào một biến hoặc đặt tên cho hàm đó.

Tham số:

  • numbers (bảng): Một bảng kiểu danh sách chứa các giá trị số
  • threshold (số): Giá trị tối thiểu, không bao gồm giá trị này, để lọc

Giá trị trả về: Một bảng chỉ chứa các số lớn hơn ngưỡng (bảng)

Tự làm thử

local function filter(list, keep)
    local result = {}
    for _, value in ipairs(list) do
        if keep(value) then
            table.insert(result, value)
        end
    end
    return result
end

function filterByThreshold(numbers, threshold)
    -- Viết code ở đây
end
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

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