2010-04-24 13 views
5

nehme ich eine Zeichenfolge in einer Tabelle am Einsetzen wie folgt:In Lua, kann ich einfach das N-te Ergebnis ohne benutzerdefinierte Funktionen auswählen?

table.insert(tbl, mystring) 

und dass mystring durch Ersetzen alle Vorkommen von "a" erzeugt, mit "b" in input:

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

Offensichtliche Möglichkeit, die beiden zu einer Aussage zu kombinieren, funktioniert nicht, weil gsub zwei Ergebnisse zurückgibt:

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

Ich denke, das ist der Preis für die Unterstützung mehrerer Rückgabewerte. Die Frage ist, gibt es eine standardmäßige eingebaute Möglichkeit, nur den ersten Rückgabewert auszuwählen? Als ich select fand, dachte ich, dass es genau das war, aber leider wählte es alle Ergebnisse ab N aus und hilft so nicht in diesem Szenario.

Jetzt weiß ich, ich kann meine eigenen select wie folgt definieren:

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

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

aber das sieht nicht richtig aus, da ich eine eingebaute Möglichkeit, dies zu tun, erwarten würde.

Also, fehlt mir ein eingebautes Konstrukt? Wenn nicht, tendieren Lua-Entwickler dazu, eine separate Variable zu verwenden, um das richtige Argument zu extrahieren oder ihre eigenen select1-Funktionen zu schreiben?

Antwort

11

Sie können den Ausdruck von Klammern umgeben:

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

Dies ist nur das erste Ergebnis auswählt.

Um die n-te Ergebnis zu erhalten, können Sie select verwenden und umgeben sie durch Klammern:

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

Danke! Ich wette, ich werde schließlich in die gleiche Situation geraten, nur das zweite Ergebnis zu haben - welche Möglichkeiten habe ich dann? –

+0

@romkyns: Aktualisiert meinen Beitrag zu beantworten. Obwohl Ihre 'select1'-Funktion besser lesbar ist. – interjay

+0

Ich verwende gerne Dummies dafür, d. H. '_, _, _, ViertelVal, _ = gibMeFive()' Ich finde es besser lesbar. – deorst

5

einen Ausdruck in Klammern wie folgt umsetzen:

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

einen Rückgabewert zwingen wird. Oder Sie könnten sie beide wie folgt fangen:

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

oder noch besser, es Dummy-Fang eine Variable zu speichern:

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

Es gibt keinen Grund, hier zwei Variablen zuzuordnen. Sie können nur eine Variable zuweisen, und der zweite Wert wird verworfen, wie am Anfang der Frage gezeigt. – interjay

+1

Nur eine Möglichkeit zu zeigen, mit mehreren Rückgabewerten neben Select umzugehen, ist es manchmal schwierig, die Rückgabewertanpassungen in großen geschachtelten Aufrufen zu verfolgen. – deorst

5

In einer Zeile: ({ funct(args) })[n] würde das n-te Ergebnis zurückgeben, ohne dass erklärt benannte Variablen.