Menu
CoddyTech

索引签名

本课属于 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
challenge icon

挑战

简单

为名字事先未知的玩家记录分数。

  1. 编写 type Scores = {[string]: number},并创建 local scores: Scores = {}。
  2. 添加分数:scores["mia"] = (scores["mia"] or 0) + 5,然后对 "leo" 做同样的操作,分数为 3。
  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 在线编译器