2009-03-26 4 views
10

Wenn geschweifte Klammern ('{' und '}') in Lua verwendet werden, wofür werden sie verwendet?Werden geschweifte Klammern in Lua verwendet?

+1

Ich war neugierig auf das Hinzufügen eines einfachen Präprozessor sie zu ersetzen mit:

t={"foo", 'b', 3} 

Sie sie auch als Sprachbücher, à la Python verwenden können das "tun/dann" und "Ende", um es ein wenig weniger wortreich zu machen. – Sydius

+0

Werfen Sie einen Blick auf Token-Filter und Metalua, auf die häufig in der Lua-L-Mailingliste unter www.lua.org verwiesen wird. Beide bieten Möglichkeiten, die Sprache auf der abstrakten Syntaxbaumebene zu ändern, und können dies möglicherweise tun. Ein Präprozessor müsste viel analysieren, um es richtig zu machen. – RBerteig

Antwort

33

Tabelle Literale.

Die Tabelle ist der zentrale Typ in Lua und kann entweder als assoziatives Array (Hashtabelle oder Wörterbuch) oder als gewöhnliches Array behandelt werden. Die Schlüssel können Werte eines beliebigen Lua-Typs außer nil sein, und die Elemente einer Tabelle können einen beliebigen Wert außer nil enthalten.

Der Zugriff auf Array-Elemente wird im Hintergrund effizienter gestaltet als der Hash-Schlüsselzugriff, die Details sind jedoch in der Regel nicht relevant. Das macht die Handhabung spärlicher Arrays praktisch, da Speicher nur für solche Zellen zugewiesen werden muss, die überhaupt einen Wert enthalten.

Dies führt zu einem universellen 1-basierten Array-Idiom, das sich für einen C-Programmierer etwas komisch anfühlt.

Zum Beispiel

a = { 1, 2, 3 } 

erzeugt ein Array in den Variablen gespeichert a mit drei Elementen, die (zufällig) die gleichen Werte wie ihre Indizes.

b = { one=1, pi=3.14, ["half pi"]=1.57, [function() return 17 end]=42 } 
: da die Elemente in aufeinanderfolgenden Indizes gespeichert werden, beginnend mit 1, die Länge der a (gegeben durch #a oder table.getn(a)) ist 3.

eine Tabelle mit nichtganzzahligen Tasten initialisieren kann wie folgt durchgeführt werden

wobei b Einträge mit den Namen "eins", "pi", "halb pi" und eine anonyme Funktion haben. Natürlich kann es schwierig sein, das letzte Element nachzuschlagen, ohne die Tabelle zu durchlaufen, es sei denn, eine Kopie dieser Funktion wird in einer anderen Variablen gespeichert.

Eine andere Stelle, die geschweifte Klammern erscheinen, ist wirklich die gleiche semantische Bedeutung, aber es ist (für einen neuen Benutzer von Lua) hinter einigen syntaktischen Zucker verborgen. Es ist üblich, Funktionen zu schreiben, die ein einzelnes Argument enthalten, das eine Tabelle sein sollte. In diesem Fall muss für den Aufruf der Funktion keine Klammer verwendet werden. Dies führt zu einem Code, der eine Mischung aus () und {} enthält, die beide offensichtlich als Funktionsaufrufoperator verwendet werden.

btn = iup.button{title="ok"} 

entspricht

btn = iup.button({title="ok"}) 

aber auch weniger hart an den Augen. Übrigens funktioniert das Aufrufen einer Funktion mit einem Argument mit einem Literalwert auch für Zeichenfolgenliterale.

4

Liste/ditionary Konstruktor (d. H. Tabellentyp Konstruktor).

Sie werden nicht für Code-Blöcke verwendet, wenn das das ist, was Sie meinen. Dafür benutzt Lua einfach das Schlüsselwort end, um den Block zu beenden.

See here

+0

Ah, richtig, ich fühle mich jetzt albern. – Sydius

+0

Es gibt keine Listen oder Wörterbücher in Lua, sondern einen "Tabellen" -Typ, der als beides dient. Geschweifte Klammern werden also als Tabellenkonstruktor verwendet. –

+0

@Alexander Gladysh: Danke, ich habe meine Antwort angepasst. –

1

Sie sind für Tabelle Literale verwendet, wie Sie in C verwenden würden:

t = {'a', 'b', 'c'} 

Das ist der einzige gemeinsame Fall. Sie werden nicht für Blocktrennzeichen verwendet.In einer lua Tabelle können Sie die Werte von verschiedenen Arten setzen:

t={name="foo", age=32}