2014-01-21 4 views
8

Ich lehre mich gerade Lua für die Entwicklung von iOS-Spielen, da ich viele sehr gute Dinge darüber gehört habe. Ich bin sehr beeindruckt von der Dokumentation, die für die Sprache vorhanden ist, was das Lernen viel einfacher macht.Was ist der Sinn der Schachtelung Klammern in Lua?

Mein Problem ist, dass ich ein Lua-Konzept gefunden habe, für das niemand eine "Anfänger" -Erklärung zu haben scheint: verschachtelte Klammern für Anführungszeichen. Zum Beispiel wurde ich gelehrt, dass lange Ketten mit entkam einfachen und doppelten Anführungszeichen wie folgt aus:

string_1 = "This is an \"escaped\" word and \"here\'s\" another." 

auch ohne die gesamte umgebende Anführungszeichen geschrieben werden konnte. Stattdessen würde man sie einfach durch doppelte Klammern ersetzen, wie zum Beispiel:

Diese beiden sind für mich völlig sinnvoll. Aber ich kann auch die string_2 Linie mit „verschachtelten Klammern“, schreiben die zwischen den beiden Sätzen der doppelten Klammern Gleichheitszeichen sind wie folgt:

string_3 = [===[This is an "escaped" word and "here's" another.]===] 

Meine Frage ist einfach. Was ist der Sinn der Syntax in string_3? Es ergibt das gleiche Ergebnis wie string_1 und string_2, wenn es als eine Eingabe für print() gegeben wird, also verstehe ich nicht, warum verschachtelte Klammern überhaupt existieren. Kann jemand bitte einem Noob (mir) helfen, eine Perspektive zu bekommen?

Antwort

11

Es würde verwendet werden, wenn Ihre Zeichenfolge eine Teilzeichenfolge enthält, die gleich dem Trennzeichen ist. Zum Beispiel würde die folgende ungültig sein:

string_3 = [===[This is an "escaped" word, the characters ]].]===] 

I:

string_2 = [[This is an "escaped" word, the characters ]].]] 

Deshalb, um für sie wie erwartet zu funktionieren, würden Sie einen anderen String-Begrenzer, wie in der folgenden verwenden müssen Ich denke, es ist sicher zu sagen, dass nicht viele String-Literale den Teilstring ]] enthalten, in welchem ​​Fall es keinen Grund gibt, die obige Syntax zu verwenden.

+0

Also, alle verschachtelten Klammern tun ist, um den Behälter machen " Tag "anders als die Zeichenfolge? Auf diese Weise würde "string_3" Folgendes ausgeben: – elersong

+0

Dies ist ein "geflüchtetes" Wort, die Zeichen]]. – elersong

+0

Stimmt das? – elersong

1

Es hilft, na ja, nisten sie:

print [==[malucart[[bbbb]]]bbbb]==] 

druckt:

malucart[[bbbb]]]bbbb 

Aber wenn das nicht genug nützlich ist, können Sie sie ganze Programme in einer Zeichenfolge setzen verwenden:

loadstring([===[print "o m g"]===])() 

Wird drucken:

o m g 

Ich persönlich benutze sie für meine statische/dynamische Bibliothek Implementierung. Im Fall, dass Sie nicht wissen, ob das Programm einen Schließbügel mit der gleichen Menge an = s hat, können Sie es mit etwas wie folgt bestimmen sollte:

local c = 0 
while contains(prog, "]" .. string.rep("=", c) .. "]") do 
    c = c + 1 
end 
-- do stuff