0Pricing
Lua Academy · 课时

将表用作字典

使用字符串键和混合类型的键存储键值对。

将表用作字典 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

字符串键

使用字符串键的表可以充当字典(哈希映射)。对于有效标识符,可以使用点号表示法 t.key 访问字段;对于任意字符串,可以使用方括号表示法 t["key"]。两种形式等价;方括号表示法支持动态键。

local user = {}
user.name = "Alice"
user["age"] = 30
user.role = "admin"

print(user.name)        -- Alice
print(user["age"])      -- 30

local field = "role"
print(user[field])      -- admin (dynamic key)

表构造器

可以使用表构造器,通过 key = value 语法初始化字典。这是在 Lua 中创建记录最常见的方式。您可以在同一个构造器中混用数组形式和字典形式的条目。

local config = {
  host = "localhost",
  port = 3306,
  database = "myapp",
  debug = false,
  tags = {"web", "api"},  -- nested array
}

print(config.host)        -- localhost
print(config.port)        -- 3306
print(config.tags[1])     -- web

使用字典计数

字典的经典应用场景是统计频率。遍历列表,将每个元素用作键,并递增对应的计数。递增前请检查是否为 nil——使用 count[word] or 0 作为初始值。

local words = {"lua","is","fast","lua","is","lua"}
local freq = {}

for _, w in ipairs(words) do
  freq[w] = (freq[w] or 0) + 1
end

for word, count in pairs(freq) do
  print(word, count)
end
-- lua 3, is 2, fast 1

使用字典分组

按某个属性对数据分组:遍历列表,使用分组键将元素追加到字典中的列表里。这相当于 Lua 版本的 SQL GROUP BY 或 Python 的 defaultdict 模式。

local people = {
  {name="Alice", dept="eng"},
  {name="Bob",   dept="hr"},
  {name="Carol", dept="eng"},
  {name="Dave",  dept="hr"},
}
local groups = {}

for _, p in ipairs(people) do
  local d = p.dept
  groups[d] = groups[d] or {}
  groups[d][#groups[d]+1] = p.name
end

print(table.concat(groups.eng, ", "))  -- Alice, Carol

检查键是否存在

将键的值与 nil 比较,以测试键是否存在。请注意:如果某个键存储的值就是 nil,该键会被视为不存在。对于存在标记,请将值存为 true,而不是 nil。

local cache = {result=42, mode="fast"}

if cache.result ~= nil then
  print("cached:", cache.result)  -- 42
end

-- Key not present:
if cache.timeout == nil then
  print("no timeout set")
end

-- Membership set pattern
local allowed = {admin=true, editor=true}
if allowed["admin"] then
  print("access granted")
end

删除键

将表中的键设为 nil 即可将其移除。键值对会消失,垃圾回收器可以回收该值占用的内存。您不能用这种方式删除局部变量,只能删除表条目。

local session = {token="abc123", user="Alice", expires=3600}
print(session.token)   -- abc123

session.token = nil
print(session.token)   -- nil (removed)

-- Count remaining keys
local count = 0
for _ in pairs(session) do count = count + 1 end
print(count)   -- 2

合并字典

遍历其中一个表,并将其条目复制到另一个表中,即可合并两个表。如果两者包含相同的键,则以后一个表中的值为准。这相当于 JavaScript 的 Object.assign。

local defaults = {color="blue", size=12, bold=false}
local overrides = {color="red", italic=true}

local function merge(base, over)
  local result = {}
  for k, v in pairs(base) do result[k] = v end
  for k, v in pairs(over) do result[k] = v end
  return result
end

local opts = merge(defaults, overrides)
print(opts.color, opts.size, opts.italic)  -- red 12 true

任意键类型

表的键可以是任意非 nil、非 NaN 的值:字符串、数字、布尔值、函数,甚至其他表。整数键和字符串键在内部的存储方式不同,但都可以统一使用方括号表示法访问。

local t = {}
local function myKey() end

t["string"] = 1
t[42] = 2
t[true] = 3
t[myKey] = 4

print(t["string"])  -- 1
print(t[42])        -- 2
print(t[true])      -- 3
print(t[myKey])     -- 4

有序遍历

Lua 的 pairs() 不保证遍历顺序。若要按确定的顺序遍历,请先将键收集到数组中并排序,然后再进行遍历。

local scores = {Alice=95, Bob=87, Carol=91, Dave=78}

local names = {}
for name in pairs(scores) do
  names[#names+1] = name
end
table.sort(names)

for _, name in ipairs(names) do
  print(name, scores[name])
end
-- Alice 95, Bob 87, Carol 91, Dave 78 (sorted)

默认值模式

一种实用模式是通过 __index 元表访问“defaults”表。当主表中找不到某个键时,Lua 会在默认值表中查找它。这样无需合并表即可实现分层配置。

local defaults = {timeout=30, retries=3, verbose=false}
local config = {timeout=60}

setmetatable(config, {__index = defaults})

print(config.timeout)  -- 60  (overridden)
print(config.retries)  -- 3   (from defaults)
print(config.verbose)  -- false (from defaults)

快速检查

在 Lua 中,如何从表 t 中移除键 "x"?

回顾:将表用作字典

要点:

  • 点号和方括号表示法:t.key == t["key"]
  • 任意非 nil、非 NaN 的值都可以作为键
  • 将键设为 nil 以删除它
  • 频率统计:t[k] = (t[k] or 0) + 1
  • 有序遍历:收集键 → 排序 → 遍历
  • 使用 __index 元表提供默认值

常见问题解答

「将表用作字典」课时是免费的吗?

是的 — 「将表用作字典」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「将表用作字典」这节课中我会学到什么?

使用字符串键和混合类型的键存储键值对。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「将表用作字典」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 将表用作数组
  2. 将表用作字典
  3. 使用 pairs 和 ipairs 遍历表
  4. 嵌套表和结构化数据
← 返回 Lua Academy