所以当我已经有一个条目时,我试图测试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
答案 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,因为您可能期望。)