遍历
在 Lua 中,pairs
和 ipairs
都是用于遍历表(table)的迭代器函数,但它们的行为和使用场景有所不同。
pairs
- 用途:
pairs
用于遍历表中的所有键值对,但它的遍历顺序并不是基于键的数值顺序,而是基于键的插入顺序和哈希部分的内部顺序。pairs
的行为可以分为两个阶段:整数键部分:首先遍历从 1 开始的连续整数键。
哈希部分:然后遍历其他类型的键(包括非连续的整数键和其他类型如字符串、表等)。
- 行为:
pairs
会遍历表中的所有元素,无论键是整数还是其他类型。它按照键的插入顺序进行遍历。 - 返回值:
pairs
返回三个值:迭代器函数、表本身和控制变量
ipairs
- 用途:
ipairs
用于遍历表中的整数键值对,并且只遍历从 1 开始的连续整数键。 - 行为:
ipairs
只会遍历从 1 开始的连续整数键,直到遇到第一个空槽或非整数键为止。 - 返回值:
ipairs
返回三个值:迭代器函数、表本身和控制变量。
示例代码
-- 使用 pairs 遍历表
local t1 = {10, 20, 30, key = "value", [5] = 50}
for k, v in pairs(t1) do
print(k, v)
end
-- 输出:
-- 1 10
-- 2 20
-- 3 30
-- 5 50
-- key value
-- 使用 ipairs 遍历表
local t2 = {10, 20, 30, 40, 50}
for i, v in ipairs(t2) do
print(i, v)
end
-- 输出:
-- 1 10
-- 2 20
-- 3 30
-- 4 40
-- 5 50
-- 注意: 如果表中有非连续的整数键或非整数键,ipairs 会在第一个不连续的地方停止
local t3 = {10, 20, 30, [5] = 50, key = "value"}
for i, v in ipairs(t3) do
print(i, v)
end
-- 输出:
-- 1 10
-- 2 20
-- 3 30
-- 如果表中没有从 1 开始的连续整数键,ipairs 不会遍历任何元素
local t4 = {[2] = 20, [3] = 30}
for i, v in ipairs(t4) do
print(i, v)
end
-- 没有输出
总结
pairs
适用于遍历表中的所有键值对,无论是整数键还是其他类型的键。ipairs
适用于遍历表中从 1 开始的连续整数键,通常用于数组类型的表。
选择使用 pairs
还是 ipairs
取决于你的具体需求。如果你需要遍历表中的所有元素,包括非整数键,使用 pairs
。如果你只需要遍历从 1 开始的连续整数键,使用 ipairs
。