2010-04-24 7 views
5

Supponiamo che inserisco una stringa in una tabella come segue:In Lua, posso selezionare facilmente il risultato Nth senza funzioni personalizzate?

table.insert(tbl, mystring) 

e che mystring è generato sostituendo tutte le occorrenze di "a" con "b" in input:

mystring = string.gsub(input, "a", "b") 

L'ovvio modo per combinare i due in una sola istruzione non funziona, perché gsub restituisce due risultati:

table.insert(tbl, string.gsub(input, "a", "b")) -- error! 
-- (second result of gsub is passed into table.insert) 

che, suppongo, è il prezzo pagato per supportare più valori di ritorno. La domanda è: esiste un modo standard incorporato per selezionare solo il primo valore di ritorno? Quando ho trovato select ho pensato che fosse esattamente quello che ha fatto, ma purtroppo, in realtà seleziona tutti i risultati da N in poi, e quindi non aiuta in questo scenario.

Ora so che posso definire il mio select come segue:

function select1(n, ...) 
    return arg[n] 
end 

table.insert(tbl, select1(1, string.gsub(input, "a", "b"))) 

ma questo non guardare a destra, dal momento che mi aspetto un built-in modo di fare questo.

Quindi, mi manca qualche costrutto integrato? In caso contrario, gli sviluppatori Lua tendono a utilizzare una variabile separata per estrarre l'argomento corretto o scrivere le proprie funzioni select1?

risposta

11

Si può circondare l'espressione tra parentesi:

table.insert(tbl, (string.gsub(input, "a", "b"))) 

Questo selezionerà solo il primo risultato.

Per ottenere il risultato all'ennesima potenza, è possibile utilizzare select e surround tra parentesi:

func1((select(n, func2()))) 
+0

Grazie! Scommetto che alla fine mi imbatterò nella stessa situazione, volendo solo il secondo _ risultato: quali opzioni ho allora? –

+0

@romkyns: aggiornato il mio post per rispondere. Anche se la tua funzione 'select1' potrebbe essere più leggibile. – interjay

+0

Mi piace usare i manichini per questo, cioè '_, _, _, fourthVal, _ = giveMeFive()' Lo trovo più leggibile in questo modo. – deorst

5

Mettere un'espressione in parentesi come questo:

table.insert(tbl, (string.gsub(input, "a", "b")))

forzerà un valore di ritorno. Oppure si potrebbe prendere entrambi in questo modo:

str,cnt = string.gsub(input, "a", "b") 
table.insert(tbl, str) 

o, meglio ancora, fermo fittizio per salvare una variabile:

str,_ = string.gsub(input, "a", "b") 
table.insert(tbl, str) 
+0

Non c'è motivo di assegnare qui due variabili. Puoi semplicemente assegnare una variabile e il secondo valore verrà scartato, come mostrato all'inizio della domanda. – interjay

+1

Solo dimostrando un modo per gestire più valori di ritorno oltre a selezionare, a volte è difficile tenere traccia degli aggiustamenti del valore di ritorno in enormi chiamate annidate. – deorst

5

In una sola riga: ({ funct(args) })[n] sarebbe restituire il risultato n'th senza dichiarare alcuna variabili nominate.

Problemi correlati