2009-09-10 17 views
31

In vielen Sprachen können Sie Strings bei der Variablenzuordnung verketten. Ich habe ein Szenario mit der Programmiersprache Lua, wo ich die Ausgabe eines Befehls an eine vorhandene Variable anhängen muss. Gibt es in Lua ein funktionelles Äquivalent zu den folgenden Beispielen? Vielen Dank im Voraus für Ihre HilfeVerkettung von Strings in Lua

===== PERL ===== 
$filename = "checkbook"; 
$filename .= ".tmp"; 
================ 

===== C# ===== 
string filename = "checkbook"; 
filename += ".tmp"; 
=============== 

:

Beispiele für andere Sprachen.

Antwort

62

Wie andere Antworten gesagt haben, ist der String Verkettung Operator in Lua zwei Punkte.

Ihr einfaches Beispiel würde wie folgt geschrieben werden:

filename = "checkbook" 
filename = filename .. ".tmp" 

Allerdings gibt es eine Einschränkung bewusst zu sein ist. Da Strings in Lua unveränderlich sind, erstellt jede Verkettung ein neues String-Objekt und kopiert die Daten von den Quellstrings dorthin. Das hat zur Folge, dass aufeinander folgende Verkettungen zu einer einzelnen Zeichenfolge sehr schlechte Leistung haben.

Die Lua Idiom für diesen Fall so etwas wie dieses:

function listvalues(s) 
    local t = { } 
    for k,v in ipairs(s) do 
     t[#t+1] = tostring(v) 
    end 
    return table.concat(t,"\n") 
end 

Durch die Saiten zu sammeln in einem Array t, die Standard-Bibliothek Routine table.concat können sie alle (zusammen mit verketten verwendet werden verkettet werden eine Trennzeichenfolge zwischen jedem Paar) ohne unnötiges Kopieren von Zeichenfolgen.

Update: Ich habe gerade bemerkt, dass ich ursprünglich den Code-Snippet oben mit pairs() statt ipairs() schrieb.

Wie ursprünglich geschrieben, würde die Funktion listvalues() zwar jeden Wert aus der übergebenen Tabelle erzeugen, aber nicht in einer stabilen oder vorhersagbaren Reihenfolge. Auf der anderen Seite würde es Werte enthalten, deren Schlüssel keine positiven ganzen Zahlen im Bereich von 1 bis #s waren. Das ist, was pairs() tut: es produziert jedes einzelne (Schlüssel, Wert) Paar in der Tabelle gespeichert.

In den meisten Fällen, in denen Sie etwas wie listvaluas() verwenden würden, wären Sie daran interessiert, ihre Bestellung zu bewahren. Ein Aufruf, der als listvalues{13, 42, 17, 4} geschrieben wird, würde also eine Zeichenfolge erzeugen, die diese Werte in dieser Reihenfolge enthält.pairs() wird dies jedoch nicht tun, es wird sie in einer Reihenfolge auflisten, die von der zugrunde liegenden Implementierung der Tabellendatenstruktur abhängt. Es ist bekannt, dass die Reihenfolge nicht nur von den Schlüsseln abhängt, sondern auch von der Reihenfolge, in der die Schlüssel eingefügt und andere Schlüssel entfernt wurden.

Natürlich ipairs() ist auch keine perfekte Antwort. Es zählt nur die Werte der Tabelle auf, die eine "Sequenz" bilden. Das heißt, diese Werte, deren Schlüssel einen ungebrochenen Block von 1 bis zu einer oberen Grenze bilden, sind (normalerweise) auch der Wert, der vom #-Operator zurückgegeben wird. (In vielen Fällen ist die Funktion ipairs() sich besser durch eine einfachere for Schleife ersetzt wird, 1-#s zählt nur. Dies ist die empfohlene Praxis in Lua 5.2 und in luajit wo die einfachere for Schleife effizienter umgesetzt werden können als die ipairs() Iterator .)

Wenn pairs() wirklich der richtige Ansatz ist, dann ist es normalerweise der Fall, dass Sie sowohl den Schlüssel als auch den Wert drucken möchten. Dies verringert die Bedenken hinsichtlich der Reihenfolge, indem die Daten selbstbeschreibend gemacht werden. Da jeder Lua-Typ (außer nil und der Gleitkommazahl NaN) als Schlüssel verwendet werden kann (und NaN kann auch als Wert gespeichert werden), wird das Finden einer Zeichenfolgendarstellung für den Schüler als Übung belassen. Und vergessen Sie nicht Bäume und komplexere Strukturen von Tischen.

1

Strings können mit dem Verkettungsoperator miteinander verbunden werden ".."

dies auch für Variablen Ich denke

6

Verkettungs:

in Lua Der String-Verkettungsoperator durch bezeichnet wird zwei Punkte ('..'). Wenn beide Operanden Strings oder Zahlen sind, werden sie gemäß den in §2.2.1 genannten Regeln in Strings konvertiert. Andernfalls wird das "concat" Metamethod aufgerufen (siehe §2.8).

aus: http://www.lua.org/manual/5.1/manual.html#2.5.4

15

Wenn Sie fragen, ob es eine Abkürzung Version von operator .. - keine gibt es nicht. Sie können a ..= b nicht schreiben. Sie müssen es vollständig eingeben: filename = filename .. ".tmp"