正常情况下,使用pairs和ipairs遍历table或数组,没有任何的区别,如下示例所示:
local tbl1 = { "apple", "pear", "orange", "grape" }
print("=============ipairs的执行结果=============")
for i, v in ipairs(tbl1) do
print(i, '=', v)
end
print("=============pairs的执行结果==============")
for i, v in pairs(tbl1) do
print(i, '=', v)
end
—执行结果如下:
=ipairs的执行结果=
1 = apple
2 = pear
3 = orange
4 = grape
=pairs的执行结果==
1 = apple
2 = pear
3 = orange
4 = grape
看一下自定义的key值,通过pairs和ipairs输出会是什么情况呢,如下所示:
local tbl2 = {}
tbl2[1] = "1"
tbl2[2] = "2"
tbl2[3] = "3"
tbl2[5] = "5"
print("=============ipairs的执行结果=============")
for i, v in ipairs(tbl2) do
print(i, '=', v)
end
print("=============pairs的执行结果=============")
for i, v in pairs(tbl2) do
print(i, '=', v)
end
print('tbl2的长度为:', #tbl2)--长度输出为3,实际上数组中的长度是4
执行结果如下所示:
=ipairs的执行结果=
1 = 1
2 = 2
3 = 3
从执行结果发现,最后一个元素没有了
=pairs的执行结果=
1 = 1
2 = 2
3 = 3
5 = 5
tbl2的长度为: 3
从以上可以发现,其实ipairs会依据key的数值从1开始加1递增遍历相应的table[i]值。 而pairs则能够遍历表中全部的key,而且除了迭代器本身以及遍历表本身还能够返回nil,可是ipairs则不能返回nil,仅仅能返回数字0,遇到nil则循环退出。 它仅仅能遍历到表中出现的第一个不是整数的key.
再看下例子,验证一下:
local tbl3 = {2, s1 = "s1", s2 = "s2", s3 = "s3" }
print("=============ipairs的执行结果=============")
for i, v in ipairs(tbl3) do
print(i, '=', v)
end
print("=============pairs的执行结果=============")
for i, v in pairs(tbl3) do
print(i, '=', v)
end
=============ipairs的执行结果=============
1 = 2
=============pairs的执行结果=============
1 = 2
s1 = s1
s3 = s3
s2 = s2
结论:遍历table或array时,如果key是非数字,请使用pairs迭代遍历。
当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。