Lua ipairs与pairs的区别

相同点和不同点

相同点

  • ipairs和pairs一般都用来对table进行遍历

不同点:

  • ipairs:ipairs是按key的顺序遍历的,从key = 1开始,对table按顺序遍历,如果key = 1有值,则会继续访问key = 2的值,如果key = 2有值,则会访问key =3 的值,如此下去。但一旦没有则会终止整个访问流程。
  • pairs: 首先pairs在遍历时,是无序的,并不会从小到大顺序遍历。但是pairs可以完整的遍历整个table,并不会像ipairs一样遇到nil就停下来。

举例说明

测试代码

tab = { [1] = 1, b = 2, c = 3,5,4,6}

print("------------ipairs遍历结果------------")
for k,v in ipairs(tab) do
    print(k..":"..v)
end

print("------------pairs遍历结果------------")

for k,v in pairs(tab) do
    print(k..":"..v)
end

测试结果

------------ipairs遍历结果------------
1:5
2:4
3:6
------------pairs遍历结果------------
1:5
2:4
3:6
c:3
b:2

测试结果分析

为什么会输出这样的结果呢。我们可以把table里的元素分为2种;

  • 1种是带 键值对(key-value),如上面声明的 [1] = 1, b = 2, c = 3 这3个元素;
  • 另外1种是 不带键值对的,如剩下的4,5,6;

table会先存储带键值对的,然后再按顺序存储不带键值对的.
1:首先存储带键值对的:

  • [1] = 1, b = 2, c = 3

2:接着存储不带键值对的 (存这种类型时,会从1开始自增,自动为其附上key),比如

  • [1] = 5, [2] = 4, [3] = 6

3: 遇到一样的key时,会覆盖掉先前的

  • 比如这里的 [1] = 1 就被 [1] = 5 覆盖掉了

4:存储后的结果

  • b = 2, c = 3, [1] = 5, [2] = 4, [3] = 6

看到存储后的结果,现在我们直接去看ipairs和pairs打印出来的结果就很清晰了。是完全符合预期的。

猜你喜欢

转载自blog.csdn.net/aaa27987/article/details/125172263