先來看lua table源碼長度獲取部分(ltable.c)
j是數組部分的長度。首先判斷數組長度大於0,並且數組最后一個是nil,就用二分法查找,返回長度。
如果t->node是 table的hash部分存放,如果是空,就返回數組的長度。
情況1.
對於這種,初始化了數組長度,t的長度是7,為什么呢。因為最后一位不是nil
所以
這種t的長度就是5
情況2.
大家都應該知道 t的長度是5
這樣的話,t的長度是多少呢???
答案是2,為什么呢?
對於t【6】的插入,導致table表rehash
t[6]會先調用(lapi.c)
然后會進入(lvm.c)
然后會調用(ltable.c)luaH_newkey這個函數
然后調用rehash
這個地方其實是數組部分和放到hash部分的計算,nums是統計數字的分布,仔細看代碼會知道數組長度是2的n次方。
這兒nil不是數字不會納入統計,所以1,2,5,6會計算出數組長度是4,其余部分放入到node部分
table是有數組 和 node hash部分組成
這樣根據我們前面看的函數,第四個是nil,所以用二分法找出的長度是2.
這樣是lua數組里面如果nil,可能會導致的坑,當然只是rehash導致的。。。