2017-02-15 89 views
1

因此,表構造函數有兩個組件,類似於列表和類似記錄。列表類項目總是優先於類似記錄的項目嗎?我的意思是,請考慮以下情形:Lua表構造函數的初始化順序

a = {[1]=1, [2]=2, 3} 
print(a[1]) -- 3 
a = {1, [2]=2, [1]=3} 
print(a[1]) -- 1 

是該指數1總是與第一列表類似的條目,2與第二相關,等等?或者還有別的嗎?

+2

未指定'a = {1,[2] = 2,[1] = 3}'的結果。 PUC Lua和LuaJIT的實際結果會有所不同。不要在生產中使用這些代碼。 –

+0

@EgorSkriptunoff那麼應該是'a = {[1] = 1,[2] = 2,3}'的結果嗎? – ibrahim5253

+0

[UB](https://en.wikipedia.org/wiki/Unspecified_behavior) –

回答

0

有兩種類型在Lua表,陣列字典,這些都是你所說的「名單」和「記錄」。一個數組,包含值的順序,這給你一些優點,如更快的迭代或插入/刪除值。 字典像一個巨大的查找表一樣工作,它沒有順序,它的優點是你可以如何使用任何值作爲一個關鍵,並且你不受限制。

當你構造一個表時,你有2個語法,你可以用逗號分隔這些值, {2,4,6,8}從而創建具有鍵1到n的數組,或者可以定義鍵值對,例如, {[1]=2,[58]=4,[368]=6,[48983]=8}創建一個字典,你可以經常混合這些語法,你不會遇到任何問題,這不是你的情況。

你在做什麼是在表的初始構造期間兩次定義相同的密鑰。這通常是不切實際的,因此在語言的發展過程中並沒有真正的認真思考。這意味着發生的事情本質上是未指定的行爲。目前還不能完全理解這將會產生什麼影響,並且可能在不同的平臺或實現中不一致。

因此,您不應該在任何商業項目或任何您將與其他人分享的代碼中使用此功能。如果有疑問,請構建一個空表並在之後定義鍵值對。

+1

_「[...]在語言開發過程中沒有真正考慮過」_是不正確的。它已經被考慮過了,但是檢查這個代碼(時間和代碼複雜度)的成本大於好處,所以沒有檢查。進一步的(輕微的挑剔),行爲不是_undefined_,而是_unspecified_(至少在C和C++標準中使用的語言) - 事情不會發生,僅僅是分配順序相等鍵未定義。 – nobody

+0

@nobody來源,它被認爲是?也將編輯在*未指定* – warspyking

+0

找不到我正在尋找的片段,但這次交流[1](http://lua-users.org/lists/lua-l/2007-03/msg00277.html), [2](http://lua-users.org/lists/lua-l/2007-03/msg00280.html)關於十年前的Lua-ML〜表明,他們意識到那時候並且有工作獨立靜態檢查器。將這個邏輯移入Lua是一個明顯的可能性(所以我認爲這個選項已經被考慮過),但是Lua對於重複鍵的行爲在自那以後發佈的幾個新版本中並沒有改變。 – nobody