Frage

In vielen Sprachen können Sie Zeichenfolgen auf Variablenzuweisung verketten. Ich habe ein Szenario, das Lua Programmiersprache, wo ich die Ausgabe eines Befehls zu einer vorhandenen Variablen anhängen müssen. Gibt es ein funktionales Äquivalent in Lua zu den folgenden Beispielen?

Beispiele für andere Sprachen:

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

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

Vielen Dank im Voraus für Ihre Hilfe.

War es hilfreich?

Lösung

Wie andere Antworten gesagt haben, ist der String-Verkettungsoperator 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. Da Strings in Lua unveränderlich ist, erzeugt jede Verkettung ein neues String-Objekt und kopiert die Daten aus dem Quell Strings zu. Das macht sukzessive Verkettungen auf eine einzelne Saite haben eine sehr schlechte Leistung.

Die Lua Idiom für diesen Fall ist so etwas wie folgt aus:

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

von den Saiten Sammeln in einem Array t konkateniert werden, der Standard-Bibliotheksroutine table.concat verwendet werden, können sie alle bis (zusammen mit einem Trennzeichen zwischen jedem Paar) ohne unnötiges Kopieren von Zeichenketten verketten.

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

Wie ursprünglich geschrieben, die Funktion listvalues() in der Tat jeden Wert aus der Tabelle hervorbringen würde übergeben, aber nicht in einer stabilen oder vorhersehbaren Reihenfolge. Auf der anderen Seite wäre es Werte enthalten, die nicht positive ganze Zahlen in der Spanne von 1 #s Schlüssel ist waren. Das ist, was pairs() tut. Es jeden einzelnen (Schlüssel, Wert) -Paar in der Tabelle gespeichert erzeugt

In den meisten Fällen, in denen Sie so etwas wie listvaluas() verwenden würden Sie deren Reihenfolge bei der Erhaltung interessiert sein würde. So ein Anruf als listvalues{13, 42, 17, 4} geschrieben würde erzeugt einen String diejenigen Werte in dieser Reihenfolge enthält. Allerdings pairs() wird das nicht tun, wird es sie in einer bestimmten Reihenfolge einzeln aufführen, die auf der zugrunde liegenden Implementierung der Tabellendatenstruktur abhängt. Es ist bekannt, dass der Auftrag nicht nur auf den Tasten abhängt, sondern auch von der Reihenfolge, in der die Schlüssel eingefügt wurden und andere Tasten entfernt.

Natürlich ipairs() ist keine perfekte Antwort entweder. Es zählt nur die Werte der Tabelle, die eine „Sequenz“ bilden. Das heißt, die Werte, den Schlüssel ist bildet einen ununterbrochenen Block von 1 bis zu einem gewissen Obergrenze Spanning, die (in der Regel) auch den Wert des # Operator zurückgegeben. (In vielen Fällen ist die Funktion ipairs() sich besser durch eine einfachere for Schleife ersetzt wird, die aus 1 zählt nur #s. Dies ist die empfohlene Praxis in Lua 5.2 und in luajit wo die einfachere for Schleife effizienter als die ipairs() Iterator implementiert werden kann ).

Wenn pairs() wirklich der richtige Ansatz ist, dann ist es in der Regel der Fall, dass Sie sowohl den Schlüssel und den Wert drucken möchten. Dies reduziert die Bedenken über, um durch die Daten selbstbeschreibende machen. Natürlich, da jede Art Lua (außer nil und der Gleitkomma-NaN) als Schlüssel verwendet werden können (und NaN auch als Wert gespeichert werden kann) ist für den Schüler als Übung einer String-Darstellung zu finden. Und vergessen Sie nicht über Bäume und komplexere Strukturen von Tabellen.

Andere Tipps

Wenn Sie fragen, ob es eine Abkürzung Version von operator .. - nein ist es nicht. Sie können nicht a ..= b schreiben. Sie werden es in voller eintippen: filename = filename .. ".tmp"

Verkettungs:

  

Der String-Verkettungsoperator in Lua wird durch zwei Punkte ( '..') bezeichnet. Wenn beide Operanden Strings oder Zahlen sind, dann werden sie in Strings umgewandelt nach den Regeln in §2.2.1 erwähnt. Andernfalls wird die „concat“ metamethod (siehe §2.8) genannt.

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

Strings verbunden werden kann zusammen den Verkettungsoperator mit ".."

Dies ist das gleiche für Variablen Ich denke

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top