目录
这里不讨论lua中pairs和ipairs的区别。仅仅从lua源码的角度,讨论使用pairs遍历table的时候,遍历结果为什么是随机的。
1 遍历结果是随机的
首先需要弄清楚,这个“遍历结果是随机的”是什么意思?
(1) 假设有 test.lua 文件如下,函数testPairs() 用来遍历输出table s:
function testPairs()
s = {a=1,aa=2,b=3,c=4,ab=3,xx=4,ax=5,ay=4,xy=6}
for k,v in pairs(s) do
print(k,v)
end
end
testPairs()
print('-----------------------------')
testPairs()
代码中执行了两次 testPairs()函数,那么输出结果如何呢:
这不是一模一样吗,哪里随机了?可能是table中元素不够多,再多塞几个元素到table中后,发现结果都是一样的。
(2) 换种方式,更改一下"test.lua"中的代码
function testPairs()
s = {a=1,aa=2,b=3,c=4,ab=3,xx=4,ax=5,ay=4,xy=6}
for k,v in pairs(s) do
print(k,v)
end
end
testPairs()
然后在命令行窗口中前后执行两次” lua test.lua”,结果如下:
这样子做,遍历结果的顺序才是随机的。此处通过表现,先简单下个结论。
使用pairs遍历table时:
如果是同一次lua程序运行期间(同一个global_State下),遍历结果的顺序是不变的(毕竟table中的值都没有变过);
否则,顺序是随机的。
2 为什么会是随机的
2.1 简单介绍table
本文仅涉及到table中的遍历,只讨论table中元素的存储方式,所以不赘述table的相关操作(插入,删除节点等操作)。
除了源码,本文还参考了codedump的《lua设计与实现》(版本5.1.4)
table的定义如下:
与遍历相关的字段为:
可以知道table是由数组和散列表两个部分组成的。