相同点和不同点
相同点
- 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打印出来的结果就很清晰了。是完全符合预期的。