lua中迭代器pairs和ipairs的比较

ipairspairs是lua标准库中提供的两种迭代器,通常用于数组和表中的元素遍历,关于两者的解释,可以参考lua语言参考手册,其中的具体解释如下

  • ipairs(t)

返回三个值(迭代函数、表 t 以及 0 ), 如此,以下代码

for i,v in ipairs(t) do body end

将迭代键值对(1,t[1]) ,(2,t[2]), … ,直到第一个空值。


  • pairs(t)

如果 t 有元方法 __pairs, 以 t 为参数调用它,并返回其返回的前三个值。

否则,返回三个值:next 函数, 表 t,以及 nil。 因此以下代码

for k,v in pairs(t) do body end

能迭代表 t 中的所有键值对。

可以很明显的看到ipairs在进行迭代时,需要迭代键值对是连续的,也就是说ipairs在遇到值为nil的数据时会认为数组或表已经结束了,不管后面还存在多少数据都不会再进行迭代。

pairs会完整的遍历整个数组或表,无论其值是否为nil

举个几个例子来展示一下

1
2
3
4
5
6
7
8
local tabFiles = {
[3] = "test2",
[6] = "test3",
[4] = "test1"
}

for k, v in ipairs(tabFiles) do
print(k, v)

1

以上代码并不会输出数据,由此可见,使用ipairs迭代器时,当键值为1时,tabFiles[1]值为nil,导致迭代器终止,所以就算后面存在有非空数值也不会继续迭代。


1
2
3
4
5
6
7
8
local tabFiles = {
[1] = "test2",
[6] = "test3",
[4] = "test1"
}

for k, v in ipairs(tabFiles) do
print(k, v)

2

当我们为键值为1的元素赋值后,可以看到使用ipairs可以正常迭代,而后面的元素依旧不会被迭代。


1
2
3
4
5
6
7
8
9
local tabFiles = {
[3] = "test2",
[6] = "test3",
[4] = "test1"
}

for k, v in pairs(tabFiles) do
print(k, v)
end

3

pairs迭代器会遍历键值,如果存在数据则输出数据,不会因为空值而中断


对于pairs迭代器,有一个非常重要的点是他的迭代顺序并不是顺序的

1
2
3
4
5
6
7
8
9
10
11
local tabFiles = {
[3] = "test2",
[6] = "test3",
[9] = "test1",
[12] = "test6",
[15] = "test4"
}

for k, v in pairs(tabFiles) do
print(k, v)
end

4

出现这个问题的原因主要还是对于lua中的表来说,是不存在顺序的。在lua语言中,表使用的是关联数组,他只存在键值和数值的对应关系,并不存在键值的排列顺序,所以在使用pairs迭代时,并不会按照键值顺序输出。解决这个问题的方法是重写pairs迭代器,让他按照键值顺序迭代输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function pairsByKeys(t)
local a = {}

for n in pairs(t) do
a[#a + 1] = n
end

table.sort(a)

local i = 0

return function()
i = i + 1
return a[i], t[a[i]]
end
end


for key, value in pairsByKeys(tbl) do
print( key, value )
end

5

首先正常遍历表,然后保存到另一个新的表中,通过table.sort方法对重新组合的表进行排序,之后就可以直接输出经过排序后的表。



-------------本文结束感谢您的阅读-------------

本文标题:lua中迭代器pairs和ipairs的比较

文章作者:J2ck7a1 Ch33

发布时间:2019年10月25日 - 11:10

最后更新:2019年10月25日 - 17:10

原始链接:http://yoursite.com/ipairs-pairs-in-lua/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。


想喝快乐水