严格模式下的空值安全
本课属于 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 值;运行时也会在假设出错的位置尽早触发崩溃,而不是在很远的地方才崩溃。
这样做的好处是:编辑代码时,检查器会强制你处理每个“可能缺失”的值,这样运行时错误就不会发生。
挑战
简单为可能缺失的名字提供一个安全的默认值。
- 将
--!strict保留在第一行。 - 编写
local function getDisplayName(fullName: string?): string,当fullName不是nil时返回它,否则返回"Anonymous User"。 - 打印
getDisplayName("John Smith")和getDisplayName(nil)。
点击 运行代码:输出会显示 John Smith 和 Anonymous User。
亲手试试
--!严格模式
-- 1)getDisplayName(fullName: string?): string,默认返回 "Anonymous User"
-- 2)分别用 "John Smith" 和 nil 调用,并打印结果
Luau 入门中的所有课
自己练习: Luau 在线编译器