Dans Lua, puis-je sélectionner facilement le résultat Nième sans fonctions personnalisées?
-
01-10-2019 - |
Question
Supposons que je sois l'insertion d'une chaîne dans une table comme suit:
table.insert(tbl, mystring)
et que mystring
est généré par le remplacement de toutes les occurrences de "a" par "b" dans input
:
mystring = string.gsub(input, "a", "b")
La façon évidente de combiner les deux dans une déclaration ne fonctionne pas, parce que les rendements de gsub
deux résultats:
table.insert(tbl, string.gsub(input, "a", "b")) -- error!
-- (second result of gsub is passed into table.insert)
qui, je suppose, est le prix payé pour supporter de multiples valeurs de retour. La question est, est-il une norme, intégrée façon de sélectionner seulement la première valeur de retour? Quand j'ai trouvé select
je pensais que c'était exactement ce qu'il a fait, mais hélas, il en fait Selects tous de résultats N partir, et n'a donc pas d'aide dans ce scénario.
Maintenant, je sais que je peux définir ma propre select
comme suit:
function select1(n, ...)
return arg[n]
end
table.insert(tbl, select1(1, string.gsub(input, "a", "b")))
mais cela ne semble pas juste, car je pense d'une manière intégrée de le faire.
Alors, suis-je manque une construction intégrée? Dans le cas contraire, ce que les développeurs Lua ont tendance à utiliser une variable distincte pour extraire l'argument correct ou écrire leurs propres fonctions select1
?
La solution
Vous pouvez entourer l'expression par des parenthèses:
table.insert(tbl, (string.gsub(input, "a", "b")))
Cela permet de sélectionner uniquement le premier résultat.
Pour obtenir le nième résultat, vous pouvez utiliser select
et l'entourer par des parenthèses:
func1( (select(n, func2())) )
Autres conseils
Mettre une expression en parenthèses comme ceci:
table.insert(tbl, (string.gsub(input, "a", "b")))
forcera une valeur de retour. Ou vous pouvez les attraper à la fois comme ceci:
str,cnt = string.gsub(input, "a", "b")
table.insert(tbl, str)
ou mieux encore, prise factice pour enregistrer une variable:
str,_ = string.gsub(input, "a", "b")
table.insert(tbl, str)
Dans une ligne. ({ funct(args) })[n]
retournerait le résultat n'th sans déclarer des variables nommées