在2个例子中,表似乎做了相同的事情,但输出不同。
local a = {
[0] = 0,
[1] = 1,
[2] = 2,
[3] = 3,
}
for i, v in pairs(a) do
print(v)
end
输出为02.3.1
local a = {}
a[0] = 0
a[1] = 1
a[2] = 2
a[3] = 3
for i, v in pairs(a) do
print(v)
end
输出是1 2 3 0
第二个例子似乎总是先输出数组部分,然后输出哈希部分。但第一个例子的顺序似乎是随机的。为什么
pairs
不能保证特定的订单。如果您想要一个特定的顺序,请使用数字for循环。
for i = 0, 3 do
print(a[i])
end
读取
http://www.lua.org/manual/5.4/manual.html#pdf-成对
http://www.lua.org/manual/5.4/manual.html#pdf-下一个
没有指定枚举索引的顺序,甚至用于数字索引。(要按数字顺序遍历表格,请使用数字表示。(
pairs
不仅不能保证特定的顺序,而且表构造函数也不能保证插入的特定顺序:
构造函数中赋值的顺序是未定义的。(只有当有重复的按键时,此订单才相关。(
Lua参考手册
因此,本声明:
该表似乎做了相同的事情
错误。它可能相当于:
local a = {}
a[3] = 3
a[2] = 2
a[1] = 1
a[0] = 0
for i, v in pairs(a) do
print(v)
end
因此,即使表遍历顺序是由插入决定的——相同的插入,相同的遍历——这将是实现细节——表构造函数可能不会从左到右逐行读取——因为Lua可能会随意打乱分配。
此外,散列映射在实践中必须调整的大小,解决冲突。如果使用表构造函数表达式,Lua将能够至少避免调整大小;理论上,它甚至可以通过选择智能插入顺序来最小化解决冲突所需的工作量。