An toàn với giá trị nil trong chế độ nghiêm ngặt
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 77 trên 80.
Lỗi khiến Lua gặp sự cố phổ biến nhất là "attempt to index nil": code giả định một giá trị tồn tại trong khi thực tế thì không. Luau giải quyết vấn đề này bằng nguyên tắc xử lý nil: trong chế độ --!strict, một string thông thường không bao giờ có thể là nil. Nếu có khả năng giá trị là nil, kiểu dữ liệu phải thể hiện điều đó bằng ?:
--!strict
local nickname: string? = nil -- hợp lệ: string hoặc nil
local username: string = nil -- ✗ lỗi kiểu dữ liệu trong chế độ strictNguyên tắc này có tác dụng theo cả hai chiều: nếu có một giá trị kiểu string?, chế độ nghiêm ngặt sẽ không cho phép bạn dùng nó như một chuỗi cho đến khi bạn xác định chắc chắn giá trị đó không phải nil. Cách thông dụng là so sánh trực tiếp, giúp thu hẹp kiểu dữ liệu giống như kiểm tra typeof:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name là chuỗi (string) ở đây
end
return "NOBODY"
endKhi nil là lỗi chứ không phải một trường hợp hợp lệ, hãy dùng assert: sau assert(x ~= nil), trình kiểm tra xem x là giá trị khác nil trong phần phạm vi còn lại, còn khi chạy, assert sẽ khiến chương trình dừng sớm ngay tại chỗ giả định sai, thay vì ở một nơi nào đó rất xa.
Lợi ích là trình kiểm tra buộc bạn xử lý mọi giá trị "có thể bị thiếu" ngay khi chỉnh sửa code, và lỗi khi chạy sẽ không bao giờ xảy ra.
Thử thách
DễĐưa ra một tên có thể bị thiếu giá trị dự phòng an toàn.
- Giữ
--!strictở dòng đầu tiên. - Viết
local function getDisplayName(fullName: string?): stringđể trả vềfullNamekhi giá trị này không phải lànil, nếu không thì trả về"Anonymous User". - In ra
getDisplayName("John Smith")vàgetDisplayName(nil).
Nhấn Chạy code: đầu ra hiển thị John Smith và Anonymous User.
Tự làm thử
--!strict
-- 1) getDisplayName(fullName: string?): string, dùng "Anonymous User" khi không có tên
-- 2) in ra kết quả với "John Smith" và nil
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 Luau11Chủ đề nâng cao
Khẳng định kiểuBộ bảo vệ kiểu với typeofKiểu neverAn toàn với giá trị nil trong chế độ nghiêm ngặtKhai báo chỉ mụcÔn tập: Các kiểu giá trị cấu hìnhÔn tập: Tinh chỉnh kiểu3Bả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