Thuộc tính tùy chọn
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 41 trên 80.
Không phải lúc nào cũng có mọi trường. Trong Lua, khi đọc một trường không tồn tại trong bảng, bạn chỉ nhận được nil. Điều này linh hoạt, nhưng cũng là nguyên nhân khiến các lỗi như attempt to concatenate a nil value xuất hiện.
Luau cho phép bạn khai báo rõ điều này trong kiểu dữ liệu: thêm ? sau kiểu của trường để đánh dấu trường đó là không bắt buộc:
type User = {
name: string, -- bắt buộc
email: string?, -- không bắt buộc: string hoặc nil
}
local alice: User = {name = "Alice", email = "alice@luau.dev"}
local bob: User = {name = "Bob"} -- ✓ hợp lệ, email không bắt buộcBạn đã gặp cách viết này với biến: string? là dạng viết tắt của string | nil. Giờ đây, ý tưởng tương tự cũng áp dụng cho từng trường riêng lẻ của một kiểu dữ liệu.
Vì một trường không bắt buộc có thể là nil, bạn phải kiểm tra trước khi sử dụng. Cách viết quen thuộc trong Lua vẫn dùng được, và ở chế độ nghiêm ngặt, bộ kiểm tra sẽ thu hẹp kiểu dữ liệu bên trong nhánh:
if bob.email then
print(`email: {bob.email}`) -- Ở đây, email là một chuỗi (string)
else
print("no email on file")
endKhông bắt buộc nghĩa là «có thể không có». Điều đó không có nghĩa là «bất kỳ kiểu dữ liệu nào». Nếu email tồn tại, nó vẫn phải là một chuỗi.
Thử thách
DễIn ra thông tin liên hệ của những người có thể không có email.
- Viết
type User = {name: string, email: string?}, rồi viếtlocal mia: User = {name = "Mia", email = "mia@coddy.tech"}vàlocal leo: User = {name = "Leo"}. - Viết
local function printContact(user: User)để in ra`{user.name}: {user.email}`, hoặc`{user.name}: no email`nếu không có email. - Gọi hàm đó với
mia, rồileo.
Nhấn Chạy code: đầu ra hiển thị Mia: mia@coddy.tech và Leo: no email.
Tự làm thử
-- 1) Định nghĩa kiểu dữ liệu User có email không bắt buộc, rồi tạo mia và leo
-- 2) Định nghĩa hàm (function) printContact(user: User) có kiểm tra email
-- 3) Gọi hàm với mia, rồi với leo
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 cao3Bả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