2016-09-17 37 views
2

所以我試圖測試table.insert在已經有一個條目時如何工作,並且我發現如果在向該條目之前的表中插入任何內容之前存在4的倍數的條目,弄亂爲什麼4的倍數搞砸了table.insert()?

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

對於t [3]和t [0,1],可能有[Lua表的有趣現象]重複(http://stackoverflow.com/questions/16076364/an-interesting-phenomenon-of-luas-table) – hjpotter92

回答

4

這是因爲table.insert默認插入在該位置#list+1,但length operator元件僅對序列和具有間隙的表中定義(如在你r案例nil, nil, nil, "this works"1, nil, nil, "this works"1, 2, nil, "this works")不是序列

你可以得到多一點的預期結果,如果您使用table.insert(t, i, i),因爲這將明確指定的元素需要插入(而不是依賴於長度運營商),但插入仍將在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,就像你可能會期望)。

+0

[5] =「這個工程「我沒有零例如我提供的例子 – user5888870

+0

@ user5888870 http://stackoverflow.com/a/16076456/1190388 – hjpotter92

+0

@ user5888870,我更新了答案詳細的倍數4. t [3]和t [5 ]工作,因爲在兩次插入之後的第一種情況下,#t == 3並且在第二種情況下#t = 5在四次插入之後(因此表格內容在兩種情況下成爲適當的序列)。 –