lua 中,數(shù)組的實現(xiàn)方式其實類似于 C++中的 map ,對于數(shù)組中所有的值,都是以鍵值對的形式來存儲(無論是顯式還是隱式),lua 內(nèi)部實際采用哈希表和數(shù)組分別保存鍵值對、普通值,所以不推薦混合使用這兩種賦值方式。尤其需要注意的一點是: lua 數(shù)組中允許 nil 值的存在,但是數(shù)組默認結(jié)束標志卻是 nil 。這類比于 C 語言中的字符串,字符串中允許'\0'存在,但當讀到'\0'時,就認為字符串已經(jīng)結(jié)束了。
初始化是例外,在 lua 相關(guān)源碼中,初始化數(shù)組時首先判斷數(shù)組的長度,若長度大于 0 ,并且最后一個值不為 nil ,返回包括 nil 的長度;若最后一個值為 nil ,則返回截至第一個非 nil 值的長度。
注意!!一定不要使用#操作符來計算包含 nil 的數(shù)組長度,這是一個未定義的操作,不一定報錯,但不能保證結(jié)果如你所想。如果你要刪除一個數(shù)組中的元素,請使用 remove 函數(shù),而不是用 nil 賦值。
local arr1 = {1, 2, 3, [5]=5}
print(#arr1) -- output: 3
local arr2 = {1, 2, 3, nil, nil}
print(#arr2) -- output: 3
local arr3 = {1, nil, 2}
arr3[5] = 5
print(#arr3) -- output: 1
local arr4 = {1,[3]=2}
arr4[4] = 4
print(#arr4) -- output: 4
按照我們上面的分析,應該為 1 ,但這里卻是 4 ,所以一定不要使用#操作符來計算包含 nil 的數(shù)組長度。