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 DirectionBê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
endCó 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.
Thử thách
DễChuyển hướng mà người chơi nhập thành một hành động.
- Viết
type Direction = "up" | "down" | "left" | "right". - Viết
local function getAction(direction: Direction): stringđể trả về"Climb","Drop","Turn left"hoặc"Turn right". - Đọc
local direction = io.read() :: Directionvà in ragetAction(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
1Bắt đầu với Luau
Luau là gì?Tại sao nên dùng Luau?Đoạn code Luau đầu tiênKiểm tra kiểu và chế độ lỗiÔn tập: Giới thiệu về Luau4Làm việc với hàm
Kiểu dữ liệu cho tham số và giá trị trả vềKiểu dữ liệu cho hàm ẩn danhHàm không trả về giá trịTham số tùy chọnGiá trị tham số mặc địnhGiá trị Boolean mặc địnhHàm có số lượng tham số thay đổiĐịnh nghĩa kiểu hàmÔn tập: hàm có kiểu dữ liệu2Kiểu dữ liệu cốt lõi
Số, chuỗi và BooleanKiểu 'any': lối thoátKiểu 'unknown'Kiểu Nil và kiểu tùy chọnSuy luận kiểu trong thực tếChú thích kiểu tường minhÔn tập: luyện tập với kiểu dữ liệu cốt lõi5Bí danh kiểu, kiểu hợp và kiểu giao
Bí danh kiểu cho kiểu nguyên thủyKiểu hợpLàm việc với kiểu hợpKiểu literalKiểu giaoKết hợp bí danh kiểuÔn tập: kết hợp kiểu nâng cao8Enums theo cách của Luau
Mẫu Enum trong LuauEnum số bằng bảngEnum chuỗi dưới dạng hợpDùng Enum hợp literalĐóng băng bảng hằng sốÔn tập: Enums theo cách của Luau3Bảng có kiểu: mảng và Map
Mảng có kiểuThêm và đọc phần tửKiểu Map là gì?Khai báo và truy cập MapDuyệt bảngBảng có cấu trúc hỗn hợpĐọc lướiTạo lướitable.unpackÔn tập: mảng và MapTự luyện tập: Trình biên dịch Luau online