2015-09-07 20 views
8

Könnte mir jemand erklären, warum table.unpack() das erste Tabellenelement nur zurückgibt, wenn es in einem Funktionsaufruf mit zusätzlichen Parametern nach table.unpack() verwendet wird? Hiertable.unpack() gibt nur das erste Element zurück

ist einige Demo-Code:

local a = {1,2,3,4,5} 
print("Test", table.unpack(a)) -- prints "Test 1 2 3 4 5" 
print(table.unpack(a), "Test") -- prints "1 Test" 

Ich verstehe nicht, warum die zweite Zeile nur 1 Test druckt. Ich würde erwarten, dass es 1 2 3 4 5 Test drucken wird. Kann jemand dieses Verhalten erklären? Ich würde auch interessieren, wie ich den zweiten Anruf zum Drucken 1 2 3 4 5 Test machen kann.

+4

Ich habe die gleiche Frage schon einmal gestellt: http://stackoverflow.com/questions/29892079/lua-unpack-messing-arguments –

+0

Siehe bearbeiten. Ich habe auch nach einem Workaround gefragt. – Andreas

+0

Siehe [hier] (http://Stackoverflow.com/a/31782250/183120), um zu wissen, wo in Lua eine Liste von Ausdrücken vorkommen kann. – legends2k

Antwort

9

table.unpack gibt mehrere Werte zurück. Das definierte Verhalten in diesem Fall ist, dass, wenn es nicht der letzte in einer Liste von Ausdrücken ist, alle bis auf den ersten zurückgegebenen Wert verworfen werden.

Vom book:

Lua stellt immer die Anzahl der Ergebnisse aus einer Funktion zu den Umständen des Anrufs. Wenn wir eine Funktion als Anweisung aufrufen, verwirft Lua alle seine Ergebnisse. Wenn wir einen Aufruf als Ausdruck verwenden, behält Lua nur das erste Ergebnis. Wir erhalten alle Ergebnisse nur dann, wenn der Aufruf der letzte (oder einzige) Ausdruck in einer Liste von Ausdrücken ist.

Als Workaround können Sie die restlichen Argumente an die Tabelle anhängen und die Tabelle so zum letzten Argument machen.

+0

Ich bin froh, dass Sie das Zitat aus der Dokumentation gefunden haben. :) – chicks

+1

Ich auch, ich habe es vor ein paar Monaten gelesen ... :) – ntki

4

table.unpack() gibt in beiden Fällen dasselbe zurück, aber im zweiten Fall erwartet Lua nur einen Wert, sodass es nicht in mehrere Argumente umgewandelt wird. Wenn es das letzte Argument ist, ist Lua in Ordnung mit mehreren Argumenten.

+0

Danke. Also ich denke, es gibt keine Möglichkeit, den zweiten Anruf "1 2 3 4 5 Test" zurückzukehren? – Andreas

+0

@Andreas * Wir erhalten alle Ergebnisse nur dann, wenn der Aufruf der letzte (oder einzige) Ausdruck in einer Liste von Ausdrücken ist. * Klingt ziemlich klar, in der anderen Antwort. –

+0

Ja, ich weiß, ich habe nur gefragt, weil es vielleicht einen Trick oder etwas zur Lösung dieses Problems gab :) – Andreas

Verwandte Themen