2013-01-06 41 views
0

我偶然發現了lua的奇怪行爲。代碼例如:Lua:將多個結果從函數傳遞給表構造函數

function foo() 
    local t = {'a', 'b', 'c'} 
    return unpack(t) 
end 

function bar() 
    local t = {'x', 'y'} 
    return unpack(t) 
end 

b = { foo(), bar() } 

for k,v in pairs(b) do 
    print(k,v) 
end 

此代碼的結果是:

1 a 
2 x 
3 y 

所以,從foo()結果所有丟棄除了第一個元素。問題是,爲什麼有些元素被丟棄? 我已經簡要地檢查了lua 5.2手冊,但是我沒有看到這種行爲的解釋。

回答

6

問題是,爲什麼有些元素被丟棄?

因爲這就是Lua的工作原理。當在列表的上下文中使用時(函數調用和函數調用...)(如表構造函數或函數調用參數列表),只會將其所有值添加到該列表中,如果它是最後元素列表。

所以:

{foo, ...} 

會把所有的可變參數的結尾。

{..., foo} 

只會將第一個可變參數放在表中。

如果你想要捆綁多個函數調用,你必須使用一個函數,將每個元素單獨放入列表中。

+1

多麼不方便。我希望,有一些重要的目的是以這種不直觀的方式來表達這部分語言。 無論如何,感謝您的快速回答。現在我知道我沒有犯一些愚蠢的小錯誤。 – pashkoff

+3

是的,有非常重要的目的。函數可以返回任意數量的結果,並且可以在不同的調用中返回不同數量的結果。這用於標記錯誤條件 - 如果發生錯誤,您只返回* nil *,* errorString *。想象一下,你想在多個文件名上調用'io.open' - 你可以期望每個元素都是* nil *或文件句柄。如果多個結果展開,您將不得不處理突然出現在數組中的錯誤字符串的特殊情況。而且,在編譯時不能知道返回值的數量。 –

+0

downvote的任何原因? Lua以這種方式工作並不是我的錯。 –