索引签名
本课属于 Coddy Lua 学习旅程的“Luau 入门”单元。第 78 课,共 80 课。
你在表这一章中见过像 {[string]: number} 这样的映射类型:索引签名:任意字符串键都会映射到一个数字值。当你编写代码时还不知道键是什么,这类类型就很有用:计数器、设置、缓存、分数,任何在运行时逐步构建的数据都适用。
type Counts = {[string]: number}
local counts: Counts = {}
counts["potion"] = 3 -- 可以使用任意字符串作为键
counts["sword"] = 1
counts["potion"] += 1 -- 值会按数字类型进行检查使用映射时,有两个运行时特性很重要。首先,读取一个从未设置过的键会返回 nil:常见的计数模式会用 or 处理这种情况,将“缺失”转换为 0:
counts[item] = (counts[item] or 0) + 1其次,pairs() 遍历映射的键时,顺序不受保证:同一个程序运行两次,访问键的顺序可能不同。每当输出必须可预测时,就把键收集到数组中,用 table.sort 对它们排序,然后遍历排序后的数组:
local keys: {string} = {}
for key in pairs(counts) do
table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
print(`{key}: {counts[key]}`)
end挑战
简单为名字事先未知的玩家记录分数。
- 编写
type Scores = {[string]: number},并创建local scores: Scores = {}。 - 添加分数:
scores["mia"] = (scores["mia"] or 0) + 5,然后对"leo"做同样的操作,分数为3。 - 打印
scores["mia"]、scores["leo"]和scores["zed"]。
按“运行代码”:输出会显示 5、3 和 nil。
亲手试试
-- 1) 先定义 type Scores = {[string]: number},再声明 local scores: Scores = {}
-- 2) 给 "mia" 加 5 分,给 "leo" 加 3 分
-- 3) 输出 mia、leo 和 zed
Luau 入门中的所有课
自己练习: Luau 在线编译器