2015-09-23 24 views
3

我在Lua中嘗試了以下代碼。前四個案件運作良好,但最後兩個案件失敗。這兩項結果我都沒有得到。問題是什麼?Lua無法解壓表以兩個零開始分配元素

v = {nil, 10, nil} 
a, b, c = unpack(v) 
-- Output: a, b, c = nil 10 nil 
print('a, b, c = ', a, b, c) 

v = {nil, nil, 10} 
a, b, c = unpack(v) 
-- Output: a, b, c = nil nil 10 
print('a, b, c = ', a, b, c) 

v = {} 
v[2] = 10 
a, b, c = unpack(v) 
-- Output: a, b, c = nil 10 nil 
print('a, b, c = ', a, b, c) 

v = {} 
v[1] = nil 
v[2] = 10 
v[3] = nil 
a, b, c = unpack(v) 
-- Output: a, b, c = nil 10 nil 
print('a, b, c = ', a, b, c) 

v = {} 
v[3] = 10 
a, b, c = unpack(v) 
-- Output: a, b, c = nil nil nil 
print('a, b, c = ', a, b, c) 

v = {} 
v[1] = nil 
v[2] = nil 
v[3] = 10 
a, b, c = unpack(v) 
-- Output: a, b, c = nil nil nil 
print('a, b, c = ', a, b, c) 

回答

3

當使用表作爲數組,需要的所有元素具有比nil不同的值。

將密鑰的值設置爲nil可有效地從該表中刪除該密鑰。但是在數組中,必須設置從1到該數組長度的所有整數鍵。 「洞」是不允許的。因此,中的行爲未指定,您的所有情況

您可以通過打印表中的所有鍵/值對驗證:

t = {0, nil, 2, 3} 

print("pairs:") 
for k, v in pairs(t) do 
    print("["..k.."]", v) 
end 

,並注意有ipairs休息,因爲它停靠在第一nil元素。

print("ipairs:") 
for k, v in ipairs(t) do 
    print("["..k.."]", v) 
end 

解決方法,你的情況在這裏回答描述:Lua unpack bug?

+1

這就是爲什麼手冊沒有使用術語「陣列」。它將表格描述爲具有「序列」或不具有序列。 #(長度)和ipairs在一個序列上很好地工作。 (#對於非序列甚至沒有確定性。) –