2009-03-26 6 views
10

Si des accolades ('{' et '}') sont utilisées dans Lua, à quoi servent-elles?Les accolades sont-elles utilisées dans Lua?

+1

J'étais curieux d'ajouter un simple, préprocesseur de les remplacer par le "do/then" et "end" pour le rendre un peu moins verbeux. – Sydius

+0

Jetez un oeil aux filtres de jetons et metalua, tous deux référencés fréquemment dans la liste de diffusion Lua-L disponible sur www.lua.org. Les deux offrent des moyens de modifier la langue au niveau de l'arbre de la syntaxe abstraite, et pourraient être en mesure de le faire. Un préprocesseur devrait faire beaucoup d'analyse pour bien faire les choses. – RBerteig

Répondre

33

Tableau littéraux.

La table est le type central dans Lua, et peut être traitée comme un tableau associatif (table de hachage ou dictionnaire) ou comme un tableau ordinaire. Les clés peuvent être des valeurs de tout type Lua sauf nil, et les éléments d'une table peuvent contenir n'importe quelle valeur sauf nil.

L'accès des membres de groupe est plus efficace que l'accès par clé de hachage dans les coulisses, mais les détails n'ont généralement pas d'importance. Cela rend la manipulation des tableaux clairsemés maniable puisque le stockage n'a besoin d'être alloué que pour les cellules qui contiennent une valeur.

Ceci conduit à un idiome de matrice universel basé sur 1 qui semble un peu étrange pour un programmeur C.

Par exemple

a = { 1, 2, 3 } 

crée un tableau stocké dans la variable a avec trois éléments (par coïncidence) possèdent les mêmes valeurs que leurs indices. Du fait que les éléments sont stockés à des indices séquentiels commençant par 1, la longueur de a (donnée par #a ou table.getn(a)) est 3.

Initialisation d'une table avec des touches non entières peut être fait comme suit:

b = { one=1, pi=3.14, ["half pi"]=1.57, [function() return 17 end]=42 } 

b aura des entrées nommées "un", "pi", "demi pi", et une fonction anonyme. Bien sûr, rechercher ce dernier élément sans itération de la table peut être délicat à moins qu'une copie de cette même fonction soit stockée dans une autre variable.

Un autre endroit où les accolades apparaissent est vraiment la même signification sémantique, mais il est caché (pour un nouvel utilisateur de Lua) derrière du sucre syntaxique. Il est courant d'écrire des fonctions qui prennent un seul argument qui devrait être une table. Dans ce cas, l'appel de la fonction ne nécessite pas l'utilisation de parenthèses. Il en résulte un code qui semble contenir un mélange de () et de {}, tous deux apparemment utilisés comme opérateur d'appel de fonction.

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

est équivalent à

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

mais est aussi moins dur sur les yeux. Incidemment, l'appel d'une fonction à un seul argument avec une valeur littérale fonctionne également pour les littéraux de chaîne.

4

constructeur liste/ditionnaire (c'est-à-dire constructeur de type table).

Ils ne sont pas utilisés pour les blocs de code si c'est ce que vous voulez dire. Pour cela, Lua utilise juste le mot-clé end pour terminer le bloc.

See here

+0

Ah, c'est vrai, je me sens bête maintenant. – Sydius

+0

Il n'y a pas de listes ou de dictionnaires dans Lua, mais un type "table" qui sert les deux. Les accolades sont donc utilisées comme constructeur de table. –

+0

@Alexander Gladysh: Merci, j'ai ajusté ma réponse. –

1

Ils sont utilisés pour les littéraux de table que vous utiliseriez dans C:

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

C'est le seul cas commun. Ils ne sont pas utilisés pour les délimiteurs de bloc.Dans une table Lua, vous pouvez mettre les valeurs de différents types:

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

Vous pouvez également les utiliser comme les dictionnaires, à la Python:

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