Menu
CoddyTech

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ế độ strict

Nguyê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"
end

Khi 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.

challenge icon

Thử thách

Dễ

Đưa ra một tên có thể bị thiếu giá trị dự phòng an toàn.

  1. Giữ --!strict ở dòng đầu tiên.
  2. Viết local function getDisplayName(fullName: string?): string để trả về fullName khi giá trị này không phải là nil, nếu không thì trả về "Anonymous User".
  3. 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

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