2015-09-07 11 views
8

Qualcuno potrebbe spiegarmi perché table.unpack() restituisce il primo elemento di tabella solo quando viene utilizzato in una chiamata di funzione con parametri aggiuntivi dopo table.unpack()?table.unpack() restituisce solo il primo elemento

Ecco il codice demo:

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" 

Non capisco il motivo per cui la seconda linea stampa appena 1 Test. Mi aspetto che stampi 1 2 3 4 5 Test. Qualcuno può spiegare questo comportamento? Sarei anche interessato a come posso effettuare la seconda chiamata per stampare 1 2 3 4 5 Test.

+4

Ho già fatto la stessa domanda: http://stackoverflow.com/questions/29892079/lua-unpack-messing-arguments –

+0

Vedi modifica. Stavo anche chiedendo una soluzione. – Andreas

+0

Vedere [here] (http://stackoverflow.com/a/31782250/183120) per sapere dove può trovarsi un elenco di espressioni in Lua. – legends2k

risposta

9

table.unpack restituisce più valori. In questo caso, il comportamento definito è che se non è l'ultimo in un elenco di espressioni, tutti i valori tranne il primo restituito verranno scartati.

Dal book:

Lua regola sempre il numero di risultati da una funzione alle circostanze della chiamata. Quando chiamiamo una funzione come una dichiarazione, Lua scarta tutti i suoi risultati. Quando usiamo una chiamata come espressione, Lua mantiene solo il primo risultato. Otteniamo tutti i risultati solo quando la chiamata è l'ultima (o l'unica) espressione in un elenco di espressioni.

Come soluzione alternativa è possibile aggiungere il resto degli argomenti alla tabella e rendere la tabella l'ultimo argomento in questo modo.

+0

Sono felice che tu abbia trovato la citazione dai documenti. :) – chicks

+1

Anch'io, l'ho letto solo pochi mesi fa ... :) – ntki

4

table.unpack() restituisce la stessa cosa in entrambi i casi, ma nel secondo caso Lua si aspetta solo un valore quindi non lo trasformerà in più argomenti. Quando è l'ultimo argomento, Lua va bene, trasformandosi in più argomenti.

+0

Grazie. Quindi immagino che non ci sia modo di far tornare la seconda chiamata "1 2 3 4 5 Test"? – Andreas

+0

@Andreas * Otteniamo tutti i risultati solo quando la chiamata è l'ultima (o l'unica) espressione in un elenco di espressioni. * Sembra abbastanza chiaro, nell'altra risposta. –

+0

Sì, lo so, l'ho appena chiesto perché forse c'era un trucco o qualcosa per ovviare a questo comportamento :) – Andreas