ipairs
和pairs
是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 | local tabFiles = { |
以上代码并不会输出数据,由此可见,使用ipairs
迭代器时,当键值为1时,tabFiles[1]值为nil,导致迭代器终止,所以就算后面存在有非空数值也不会继续迭代。
1 | local tabFiles = { |
当我们为键值为1的元素赋值后,可以看到使用ipairs
可以正常迭代,而后面的元素依旧不会被迭代。
1 | local tabFiles = { |
pairs
迭代器会遍历键值,如果存在数据则输出数据,不会因为空值而中断
对于pairs
迭代器,有一个非常重要的点是他的迭代顺序并不是顺序的
1 | local tabFiles = { |
出现这个问题的原因主要还是对于lua中的表来说,是不存在顺序的。在lua语言中,表使用的是关联数组,他只存在键值和数值的对应关系,并不存在键值的排列顺序,所以在使用pairs
迭代时,并不会按照键值顺序输出。解决这个问题的方法是重写pairs
迭代器,让他按照键值顺序迭代输出。
1 | function pairsByKeys(t) |
首先正常遍历表,然后保存到另一个新的表中,通过table.sort
方法对重新组合的表进行排序,之后就可以直接输出经过排序后的表。