Menu
CoddyTech

可选属性

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

并非每个字段都一定存在。在 Lua 中,缺失的表字段读取时会得到 nil,这很灵活,但也正因如此,像 attempt to concatenate a nil value 这样的 bug 很容易悄悄出现。

Luau 允许你明确标记这种类型:在字段的类型后添加 ?,表示它是可选的:

type User = {
    name: string,   -- 必填
    email: string?, -- 可选:字符串或 nil
}

local alice: User = {name = "Alice", email = "alice@luau.dev"}
local bob: User = {name = "Bob"} -- ✓ 没问题,email 是可选的

你之前在变量中见过这种写法:string? 是 string | nil 的简写。现在,同样的概念也适用于类型结构中的单个字段。

由于可选字段可能是 nil,使用前必须先检查。经典的 Lua 写法依然适用,在严格模式下,检查器会在分支内部缩窄类型:

if bob.email then
    print(`email: {bob.email}`) -- 这里的 email 是字符串
else
    print("no email on file")
end

可选表示“可能不存在”。它不表示“可以是任意类型”。如果 email 存在,它仍然必须是字符串。

challenge icon

挑战

简单

打印电子邮件可能缺失的联系人。

  1. 编写 type User = {name: string, email: string?},然后编写 local mia: User = {name = "Mia", email = "mia@coddy.tech"} 和 local leo: User = {name = "Leo"}。
  2. 编写 local function printContact(user: User),打印 `{user.name}: {user.email}`,没有电子邮件时则打印 `{user.name}: no email`。
  3. 先对 mia 调用它,然后对 leo 调用它。

点击运行代码:输出会显示 Mia: mia@coddy.tech 和 Leo: no email。

亲手试试

-- 1)定义类型 User,其中 email 可选,然后创建 mia 和 leo
-- 2)定义 printContact(user: User),检查 email
-- 3)先用 mia 调用它,再用 leo 调用

Luau 入门中的所有课

自己练习: Luau 在线编译器