Lua 的 pairs 函数 是 Lua 中用于遍历表(table)的迭代器函数,它会返回三个值:
- 迭代器函数
- 表本身
- 初始索引(
nil)
基本语法:
for key, value in pairs(t) do
-- 循环体
end
工作原理
pairs 会遍历表中的所有键值对,包括:
- 数组部分(连续数字索引)
- 哈希部分(非数字索引或非连续数字索引)
- 元表中的
__pairs元方法(如果存在)
与 ipairs 的区别
| 特性 | pairs | ipairs |
|---|---|---|
| 遍历范围 | 所有键值对 | 仅连续数字索引(1,2,3…) |
| 顺序 | 不确定 | 从1开始顺序遍历 |
| 跳过nil | 不跳过 | 遇到nil则停止 |
| 元表支持 | 支持__pairs | 不支持元方法 |
实际应用示例
1. 遍历混合类型表
local t = {
"apple", -- 索引1
"banana", -- 索引2
color = "red", -- 字符串键
[5] = "orange", -- 非连续数字索引
[true] = "yes" -- 布尔值键
}
for k, v in pairs(t) do
print(k, v)
end
-- 可能的输出(顺序不确定):
-- 1 apple
-- 2 banana
-- 5 orange
-- color red
-- true yes
2. 实现自定义迭代器
通过元表__pairs可以自定义遍历行为:
local mt = {
__pairs = function(t)
local keys = {}
for k in pairs(t) do
if type(k) == "string" then -- 只遍历字符串键
table.insert(keys, k)
end
end
table.sort(keys) -- 按字母顺序排序
local i = 0
return function()
i = i + 1
if keys[i] then
return keys[i], t[keys[i]]
end
end
end
}
local t = setmetatable({a=1, b=2, [1]="x", [2]="y"}, mt)
for k, v in pairs(t) do
print(k, v) -- 只会输出 a 1 和 b 2,且按字母顺序
end
性能注意事项
常见问题
为什么有时 pairs 会跳过某些元素?
这通常是因为:
- 键包含特殊值(如 NaN)
- 表在遍历过程中被修改
- 使用了弱引用表
如何保证遍历顺序?
如果需要特定顺序,可以:
- 先收集所有键到数组
- 对数组排序
- 按排序后的键顺序访问值
local t = {z=3, a=1, b=2}
local keys = {}
for k in pairs(t) do
table.insert(keys, k)
end
table.sort(keys)
for _, k in ipairs(keys) do
print(k, t[k]) -- 输出 a 1, b 2, z 3
end
2642

被折叠的 条评论
为什么被折叠?



