Menu
CoddyTech

严格模式下的空值安全

本课属于 Coddy Lua 学习旅程的“Luau 入门”单元。第 77 课,共 80 课。

最常见的 Lua 崩溃是 “attempt to index nil”:代码假定某个值存在,但实际上它并不存在。Luau 的解决办法是严格处理 nil:在 --!strict 下,普通的 string 绝不可能是 nil。如果 nil 确实有可能出现,类型就必须用 ? 表示这一点:

--!strict
local nickname: string? = nil   -- 可以:string 或 nil
local username: string = nil    -- ✗ 严格模式下的数据类型错误

这种严格处理是双向的:给定一个 string?,在你排除 nil 的可能性之前,严格模式不允许你把它当作字符串使用。标准做法是直接进行比较,它的类型收窄方式与 typeof 检查相同:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- 这里的 name 是字符串
    end
    return "NOBODY"
end

如果 nil 会导致错误,而不是一种有效情况,就使用 assert:调用 assert(x ~= nil) 后,检查器会在当前作用域的剩余部分将 x 视为非 nil 值;运行时也会在假设出错的位置尽早触发崩溃,而不是在很远的地方才崩溃。

这样做的好处是:编辑代码时,检查器会强制你处理每个“可能缺失”的值,这样运行时错误就不会发生。

challenge icon

挑战

简单

为可能缺失的名字提供一个安全的默认值。

  1. 将 --!strict 保留在第一行。
  2. 编写 local function getDisplayName(fullName: string?): string,当 fullName 不是 nil 时返回它,否则返回 "Anonymous User"。
  3. 打印 getDisplayName("John Smith") 和 getDisplayName(nil)。

点击 运行代码:输出会显示 John Smith 和 Anonymous User。

亲手试试

--!严格模式
-- 1)getDisplayName(fullName: string?): string,默认返回 "Anonymous User"
-- 2)分别用 "John Smith" 和 nil 调用,并打印结果

Luau 入门中的所有课

自己练习: Luau 在线编译器