In Lua, posso facilmente selezionare il risultato ennesimo senza funzioni personalizzate?
-
01-10-2019 - |
Domanda
Supponiamo che io sono l'inserimento di una stringa in una tabella come segue:
table.insert(tbl, mystring)
e che mystring
è generato sostituendo tutte le occorrenze di "a" con "b" in input
:
mystring = string.gsub(input, "a", "b")
Il modo più ovvio per combinare i due in una dichiarazione non funziona, perché i rendimenti gsub
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 il supporto di più valori di ritorno. La domanda è, c'è uno standard, built-in modo per selezionare solo il primo valore di ritorno? Quando ho trovato select
ho pensato che era esattamente quello che ha fatto, ma purtroppo, in realtà di selezionare tutti 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 sembra giusto, dal momento che mi aspetto un built-in modo di fare questo.
Quindi, mi manca un po 'built-in costrutto? In caso contrario, lo fanno gli sviluppatori Lua tendono ad usare una variabile separata per estrarre l'argomento corretto o scrivere i propri funzioni select1
?
Soluzione
È possibile circondare l'espressione tra parentesi:
table.insert(tbl, (string.gsub(input, "a", "b")))
In questo modo selezionare solo il primo risultato.
Per ottenere il risultato all'ennesima potenza, è possibile utilizzare select
e surround tra parentesi:
func1( (select(n, func2())) )
Altri suggerimenti
Mettere un'espressione in parentesi in questo modo:
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)
In una sola riga:. ({ funct(args) })[n]
sarebbe tornato il risultato n'th senza dichiarare alcuna variabile di nome