2009-03-26 9 views
10

Si se usan corchetes ('{' y '}') en Lua, ¿para qué se usan?¿Se utilizan llaves en Lua?

+1

tenía curiosidad acerca de cómo agregar un preprocesador simple de reemplazarlos con el "do/then" y "end" para hacerlo un poco menos detallado. – Sydius

+0

Eche un vistazo a los filtros token y metalua, ambos a los que se hace referencia frecuentemente en la lista de correo de Lua-L que se encuentra en www.lua.org. Ambas ofrecen formas de modificar el lenguaje en el nivel del árbol de sintaxis abstracta, y podrían ser capaces de hacerlo. Un preprocesador necesitaría analizar mucho para hacerlo bien. – RBerteig

Respuesta

33

literales de mesa.

La tabla es el tipo central en Lua, y puede tratarse como una matriz asociativa (tabla hash o diccionario) o como una matriz ordinaria. Las claves pueden ser valores de cualquier tipo de Lua, excepto nil, y los elementos de una tabla pueden contener cualquier valor excepto nil.

El acceso de miembro de matriz se hace más eficiente que el acceso a la tecla de acceso directo detrás de escena, pero los detalles no suelen importar. Eso realmente hace que el manejo de matrices dispersas sea práctico, ya que solo se debe asignar el almacenamiento para aquellas celdas que contienen un valor.

Esto conduce a un idioma universal de matriz basado en 1 que se siente un poco extraño para un programador C.

Por ejemplo

a = { 1, 2, 3 } 

crea una matriz almacenado en la variable a con tres elementos que (casualmente) tienen los mismos valores que sus índices. Debido a que los elementos se almacenan en índices secuenciales que comienzan con 1, la longitud de a (dada por #a o table.getn(a)) es de 3.

Inicialización de una mesa con llaves no enteros se puede hacer de esta manera:

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

donde b tendrá entradas llamadas "one", "pi", "half pi" y una función anónima. Por supuesto, buscar ese último elemento sin iterar en la tabla puede ser complicado a menos que una copia de esa misma función esté almacenada en alguna otra variable.

Otro lugar en el que aparecen las llaves es realmente el mismo significado semántico, pero está oculto (para un nuevo usuario de Lua) detrás de algún azúcar sintáctico. Es común escribir funciones que toman un solo argumento que debería ser una tabla. En ese caso, llamar a la función no requiere el uso de paréntesis. Esto da como resultado un código que parece contener una combinación de () y {} ambos aparentemente utilizados como un operador de llamada a función.

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

es equivalente a

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

sino que también es menos difícil en los ojos. Por cierto, llamar a una función de argumento único con un valor literal también funciona para literales de cadena.

4

list/ditionary constructor (es decir, constructor de tipo de tabla).

No se usan para bloques de código si eso es lo que quieres decir. Para eso Lua simplemente usa la palabra clave final para finalizar el bloque.

See here

+0

Ah, claro, me siento tonto ahora. – Sydius

+0

No hay listas o diccionarios en Lua, sino un tipo de "tabla" que sirve como ambos. Entonces, los corchetes se usan como un constructor de tablas. –

+0

@ Alexander Gladysh: Gracias, ajusté mi respuesta. –

1

Se utilizan para los literales de mesa del mismo modo que en C:

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

Ese es el único caso común. No se usan para delimitadores de bloques.En una tabla lua, puede poner los valores de diferentes tipos:

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

También se pueden utilizar como Diccionarios, a la Python:

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