表结构与宽松表的区别
本课属于 Coddy Lua 学习旅程的“Luau 入门”单元。第 42 课,共 80 课。
现在,你可以通过两种方式使用记录表:一直以来在 Lua 中使用的宽松方式,以及声明形状的方式。不妨停下来看看它们各自有什么好处。
宽松表可以接受任何内容,但这种灵活性是有代价的:如果把字段拼错(user.nmae),你会悄悄得到 nil;如果漏掉一个字段,错误就会在很远的地方暴露出来,也就是运行时最先访问这个空缺的代码中:
local user = {name = "Ana", age = 20}
print(user.nmae) -- 宽松的表:不报错,直接输出 nil声明形状后,这些错误就会从运行时提前到编辑时。你刚写下拼错的字段,检查器就会标出;编辑器还可以自动补全字段名,而 type 声明也能作为表中所含内容的文档:
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ 类型错误:在 User 中找不到键 'nmae'如果你是从 TypeScript 转来的,请注意,Luau 没有 interface 关键字:所有形状都由 type 处理。它也没有“声明合并”:在同一作用域中声明两个同名类型会报错,因此每种形状都只有一个定义。
Luau 的形状是结构化的:只要表包含正确类型的正确字段,无论它是在何处或以何种方式创建的,都符合该形状。宽松表也仍有用武之地:快速编写脚本和处理真正动态的数据时,不需要声明形状。不过,对于在函数之间传递的任何内容,形状都能趁错误还容易修复时将其捕获。
挑战
简单把一个未声明形状的表转换为声明了形状的表。
- 在表格上方,写入
type Pet = {name: string, age: number}。 - 为表添加类型注解:
local pet: Pet = {name = "Biscuit", age = 3}。 - 在第一条打印语句下方,添加
print(pet.age)。
按下 运行代码:输出会显示 Biscuit 和 3。
亲手试试
-- 一个宽松的表:没有任何机制检查它的字段
local pet = {name = "Biscuit", age = 3}
print(pet.name)
Luau 入门中的所有课
自己练习: Luau 在线编译器