先來看lua table源碼長度獲取部分(ltable.c)node
j是數組部分的長度。首先判斷數組長度大於0,而且數組最後一個是nil,就用二分法查找,返回長度。api
若是t->node是 table的hash部分存放,若是是空,就返回數組的長度。數組
狀況1.函數
對於這種,初始化了數組長度,t的長度是7,爲何呢。由於最後一位不是nillua
因此3d
這種t的長度就是5blog
狀況2.get
你們都應該知道 t的長度是5源碼
這樣的話,t的長度是多少呢???hash
答案是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致使的。。。