在第4部分,表中的Implementation of Lua 5.0有和實施例:
local t = {100, 200, 300, x = 9.3}
的Lua:理解表陣列部分和散列部
因此,我們有t[4] == nil
。如果我寫t[0] = 0
,這將去散列部分。
如果我寫t[5] = 500
它會去哪裏? 陣列部分或散列部分?
如果有區別,我會渴望聽到Lua 5.1,Lua 5.2和LuaJIT 2實現的答案。
在第4部分,表中的Implementation of Lua 5.0有和實施例:
local t = {100, 200, 300, x = 9.3}
的Lua:理解表陣列部分和散列部
因此,我們有t[4] == nil
。如果我寫t[0] = 0
,這將去散列部分。
如果我寫t[5] = 500
它會去哪裏? 陣列部分或散列部分?
如果有區別,我會渴望聽到Lua 5.1,Lua 5.2和LuaJIT 2實現的答案。
從1開始的連續整數鍵總是進入數組部分。
非正整數的鍵總是進入散列部分。
除此之外,它是不確定的,所以你無法預測t[5]
將存儲根據規格(它可能會或可能不會在兩者之間移動,例如如果你創建然後刪除t[4]
。)
LuaJIT 2略有不同 - 它也會在陣列部分存儲t[0]
。
如果你需要它是可預測的(這可能是一種設計氣味),堅持純數組表格(連續的整數鍵從1開始 - 如果你想留下空隙使用值爲false
而不是nil
)或純哈希表(避免非負整數的鍵。)
指出表格特徵的功能區別時,如果正整數鍵保持連續,則默認'#t'的使用纔有意義。正如@lhf所說,其餘部分是一個實現細節。 –
從Lua 5.0
陣列部分試圖對應於整數的鍵的值從1到存儲一些限制n.Values的實現引用對應於非整數鍵或數組範圍外的整數鍵存儲在哈希部分中的 。
數組部分的索引從1開始,這就是爲什麼t[0] = 0
會去散列部分。
陣列部分的所計算的大小是最大nsuch至少一半1和n之間的時隙在使用中(以避免與稀疏數組浪費空間),並有至少一個用於時隙n之間/ 2 + 1和n(當n/2時會避免大小n)。
從該規則根據,在該示例表:
local t = {100, 200, 300, x = 9.3}
保持3個元件的陣列的一部分,可以具有大小爲3,4或5。(編輯的:大小應爲4見@ dualed的評論。)
假設寫t[5] = 500
當數組的大小爲4,該陣列可以部分不再擔任該元素t[5]
,如果陣列部分調整到什麼8?大小爲8時,數組部分包含4個元素,這等於(所以不少於)數組大小的一半。而在n/2 + 1和n之間的索引,在這種情況下,它是5到8,具有一個元素:t[5]
。所以一個8的數組大小就可以達到要求。在這種情況下,t[5]
將進入數組部分。
根據http://www.lua.org/gems/sample.pdf第19頁,它不能是3或5的大小,因爲數組部分的大小爲'2^m',所以它會是4 – dualed
@dualed謝謝,我這麼認爲,但沒有證據。 –
爲什麼你需要知道這個?這是一個實現細節。 Lua處理稀疏數組就好了。 – lhf