2010-04-24 25 views
5

suppose que je suis l'insertion d'une chaîne de caractères dans un tableau comme suit:Dans Lua, puis-je facilement sélectionner le résultat Nth sans fonctions personnalisées?

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") 

L'évidence façon de combiner les deux en une seule instruction ne fonctionne pas, car gsub renvoie 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 soutenir plusieurs valeurs de retour. La question est, y a-t-il un moyen standard, intégré pour sélectionner uniquement 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 sélectionne effectivement tous les résultats à partir de N, et ne contribue donc pas 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, est-ce qu'il me manque un construit intégré? Si non, les développeurs de Lua ont-ils tendance à utiliser une variable séparée pour extraire l'argument correct ou écrire leurs propres fonctions select1?

Répondre

11

Vous pouvez entourer l'expression par des parenthèses:

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

Cela sélectionnera seulement 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()))) 
+0

Merci! Je parie que je finirai dans la même situation en ne voulant que le résultat _second_ - quelles options ai-je alors? –

+0

@romkyns: Mise à jour de mon post pour répondre. Bien que votre fonction 'select1' puisse être plus lisible. – interjay

+0

J'aime utiliser des tétines pour cela, par exemple '_, _, _, fourthVal, _ = giveMeFive()' Je le trouve plus lisible de cette façon. – deorst

5

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 sauver une variable:

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

Il n'y a pas de raison d'attribuer deux variables ici. Vous pouvez simplement affecter une variable et la deuxième valeur sera rejetée, comme indiqué au début de la question. – interjay

+1

Juste en démontrant un moyen de traiter plusieurs valeurs de retour en plus de sélectionner, il est parfois difficile de garder trace des ajustements de valeur de retour dans les énormes appels imbriqués. – deorst

5

En une ligne: ({ funct(args) })[n] retournerait le résultat sans déclarer aucune n'th variables nommées