为什么4的倍数搞砸了table.insert()?

时间:2016-09-17 05:59:11

标签: lua lua-table

所以当我已经有一个条目时,我试图测试table.insert的工作方式,并且我发现如果在该条目之前的表中插入任何内容之前存在4的倍数的条目,它搞砸了

t = {}
t[4] = "this works"
for i = 1,9 do
table.insert(t,i)
end
for i = 1,#t do
print(t[i])
end
print("total: "..#t)

输出:

1
2
nil
this works
3
4
5
6
7
8
9
total: 11

1 个答案:

答案 0 :(得分:4)

这是因为table.insert默认情况下会在#list+1位置插入元素,但length operator仅为序列和带有间隙的表格定义(如在您的情况下nil, nil, nil, "this works"1, nil, nil, "this works"1, 2, nil, "this works")不是序列

如果使用table.insert(t, i, i),可以获得更多预期结果,因为这将明确指定元素需要插入的位置(而不是依赖于length运算符),但插入仍将受到影响表中的nil个元素。如果你这样做,在4次插入后你可能会得到{1, 2, 3, 4, "this works"},并且在5次插入后你可能会得到{1, 2, 3, 4, 5, "this works"},这可能是你需要的,也可能不是。

(具体回答你关于4的倍数的问题:长度运算符使用二进制搜索,这也取决于已经存储在表的数组部分中的元素数量。当你有1, 2, nil, 4时,算法找到2然后找到4,它满足序列长度值的标准(n值不是nil,但是n+1值是),所以它返回4和下一个元素插入位置5而不是3,因为您可能期望。)