2016-05-22 7 views
3

Hier ist, was ich sehe:Was geschieht, wenn ich unpack() als lua's Funktionsargumente aufruft?

> function test(...) 
>> for i, v in ipairs({...}) do 
>> print(v) 
>> end 
>>end 

-- This is expected 
> test(unpack({1,2})) 
1 
2 
-- When I mix unpack and regular arguments 
-- What happened to 2? 
> test(unpack({1,2}), 3) 
1 
3 
-- What happened to 3? 
> test(unpack({}), 3) 

-- When I put regular args before unpack, everything is fine: 
> test(1, unpack({2, 3})) 
1 
2 
3 

Als ich ausgepackt Argumente mit regelmäßigen args mischen, sind das Ergebnis seltsam. Kannst du erklären, was unter der Haube passiert?

Antwort

3

Ich werde die Referenz Lua zitieren:

Beide Funktionsaufrufe und Vararg Ausdrücke in mehreren Werten führen kann. Wenn ein Ausdruck als Anweisung verwendet wird (nur für Funktionsaufrufe möglich (siehe §2.4.6)), wird seine Rückkehrliste auf Elemente zurückgesetzt, wodurch alle zurückgegebenen Werte verworfen werden. Wenn ein Ausdruck als letztes (oder einziges) Element einer Liste von Ausdrücken verwendet wird, wird keine Anpassung vorgenommen (außer der Aufruf ist in Klammern eingeschlossen). In allen anderen Kontexten passt Lua die Ergebnisliste auf ein Element an, verwirft alle Werte außer dem ersten.

Wie Sie Ihr auspacken Anruf sehen auf einen Rückgabewert reduziert, da es weder die letzten noch der einzige Ausdruck in der Liste von Ausdrücken übergeben Sie zu Test:

test(unpack({1,2}), 3) 

Im anderen Fall des Antwort ist ziemlich einfach:

test(unpack({}), 3) 

Der erste Wert, der an Test übergeben wird, ist Null. Dafür for i, v in ipairs({...}) do end wird nichts tun, als erster Wert des Tisches nil als unpack({}) Rückkehr ist nil

ipairs (t)

Returns drei Werte (eine Iterator-Funktion, die Tabelle t und 0) so , dass der Bau

for i,v in ipairs(t) do body end 

wird in den Schlüssel-Wert-Paaren iterieren (1, t [1]), (2, t) [2], ..., bis zum ersten Nullwert.

4

Siehe Erklärung in Lua Anleitung:

Wenn ein Ausdruck als die letzten (oder nur) Element einer Liste von Ausdrücken verwendet, dann wird keine Anpassung vorgenommen (es sei denn, der Ausdruck in eingeschlossen ist Klammern). In allen anderen Kontexten stellt Lua die Ergebnisliste auf ein Element, entweder alle Werte mit Ausnahme des ersten

Sie erhalten Verwerfen genau diesen. Unpack() gibt mehrere Werte zurück, und die Liste der zurückgegebenen Elemente wird auf 1 Element reduziert, es sei denn, es ist der letzte Ausdruck in test() - Argumenten.