Menu
CoddyTech

Dùng Enum hợp literal

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

Các kiểu hợp nhất dạng literal phát huy tác dụng tốt nhất khi dùng làm tham số của hàm. Gán kiểu hợp nhất cho tham số, bộ kiểm tra sẽ đảm bảo hàm chỉ được gọi với một giá trị hợp lệ trong kiểu đó:

type Direction = "up" | "down" | "left" | "right"

local function move(direction: Direction)
    print(`Moving {direction}...`)
end

move("left")  -- ✓
move("north") -- ✗ lỗi kiểu dữ liệu: không phải Direction

Bên trong hàm, xử lý đầy đủ mọi trường hợp bằng chuỗi if/elseif. Vì kiểu dữ liệu giới hạn đầu vào ở bốn giá trị, bạn chỉ cần kiểm tra ba giá trị rồi để else xử lý giá trị cuối cùng là đã bao quát hết:

local function describe(direction: Direction): string
    if direction == "up" then
        return "Going upward"
    elseif direction == "down" then
        return "Going downward"
    elseif direction == "left" then
        return "Turning left"
    else
        return "Turning right"
    end
end

Có một điểm cần lưu ý: các chuỗi đến từ bên ngoài, chẳng hạn như io.read(), có kiểu là string thông thường, vì bộ kiểm tra không thể biết người dùng sẽ nhập gì. Toán tử ép kiểu :: của Luau giải quyết việc này: value :: Type yêu cầu bộ kiểm tra xem giá trị đó là kiểu đã chỉ định. Bài học về xác nhận kiểu ở gần cuối phần này sẽ trình bày đầy đủ về ép kiểu. Còn bây giờ, chỉ cần một dòng:

local direction = io.read() :: Direction

Ép kiểu là một lời hứa, không phải bước kiểm tra. Khi chạy, không có gì xác minh đầu vào. Trong code thực tế, bạn cần xác thực trước. Ở đây, cách này giúp các hàm có kiểu nhận đầu vào từ người dùng một cách thuận tiện.

challenge icon

Thử thách

Dễ

Chuyển hướng mà người chơi nhập thành một hành động.

  1. Viết type Direction = "up" | "down" | "left" | "right".
  2. Viết local function getAction(direction: Direction): string để trả về "Climb", "Drop", "Turn left" hoặc "Turn right".
  3. Đọc local direction = io.read() :: Direction và in ra getAction(direction).

Nhấn Chạy code: với đầu vào up, đầu ra hiển thị Climb.

Tự làm thử

-- 1) Kiểu dữ liệu Direction
-- 2) getAction(direction: Direction): string
-- 3) Khai báo local direction = io.read() :: Direction, rồi in ra hành động

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