2010-12-22 16 views
12

Supongamos que desea crear una tabla Lua, y todas sus claves son identificadores lua válidos. A continuación, puede utilizar la sintaxis key=value:Lua: creación de tabla implícita con claves de cadena: ¿por qué los corchetes adicionales?

local niceTable = { I=1, like=1, this=1, syntax=1 } 

Sin embargo, si sus cadenas no son "identificable", entonces usted tiene que utilizar la sintaxis ['key']=value:

local operators = { ['*']="Why", ['+']="the", ['/']="brackets", ['?']='?' } 

estoy un poco confundido acerca de esto. ¿Qué están haciendo esos corchetes allí? ¿Qué quieren decir?

Respuesta

18

Identifican la cadena contenida como una clave en la tabla resultante. La primera forma, se podría considerar como iguales a

local niceTable = {} 
niceTable.I = 1; 
niceTable.like = 1; 

La segunda forma es igual a

local operators = {} 
operators['*'] = "Why"; 
operators['+'] = "The"; 

La diferencia es puramente sintácticas, excepto cuando el primero utiliza identificadores, por lo que tiene que seguir las reglas de identificador, como no comienza con un número e constante de tiempo de interpretación, y el segundo forma utiliza cualquier cadena anterior, por lo que se puede determinar en tiempo de ejecución, por ejemplo, y una cadena que no es un identificador legal. Sin embargo, el resultado es básicamente el mismo. La necesidad de los corchetes se explica fácilmente.

local var = 5; 
local table = { 
    var = 5; 
}; 
-- table.var = 5; 

Aquí, var es el identificador, no la variable.

local table = { 
    [var] = 5; 
}; 
-- table[5] = 5; 

Aquí, var es la variable, no el identificador.

+0

Así que es básicamente una forma sintáctica de diferenciar entre "el valor de var" y el "valor var" :) Gracias por su respuesta, creo Entiendo ahora. Creo que prefiero la forma de hacer las cosas de Ruby (siempre requiere la clave completa, sin atajos, pero tiene una sintaxis abreviada para cadenas identificables) – kikito

17

La sintaxis normal para indexar una tabla es t[val]. Solo para claves de cadena, Lua proporciona una sintaxis alternativa , donde t.foo es exactamente equivalente a t["foo"]. Esto es puramente una conveniencia sintáctica, llamada 'azúcar sintáctica'. No agrega funcionalidad, solo te proporciona una sintaxis menos complicada para usar cadenas como campos con nombre.

Hay muchas llaves cadenas esto no funcionará para:

t["hello_world"] => t.hello_world -- works 
t["hello world"] => t.hello world -- oops, space in the string 
t["5 * 3"]  => t.5 * 3  -- oops 
t['[10]']  => t.[10]   -- oops 

Básicamente sólo funciona si la clave de cadena sería un identificador válido.

Una vez más, las tablas se indexan a través [], y en la mayoría de los casos es necesario utilizar ellos:

t = { 
    -- [key]   = value 
    [10]    = "ten", -- number key, string value 
    ["print function"] = print, -- string key, function value 
    ["sub table"]  = {}, -- string key, table value 
    [print]   = 111, -- function key, number value 
    ["foo"]   = 123, -- string key, number value 
} 

Sólo si está utilizando una clave de cadena que funcionaría como un identificador válido (sin espacios, contiene solo caracteres de palabras, números o subrayados, y no comienza con un número) puede usar la sintaxis de acceso directo. Para la tabla anterior, que sería única 'foo':

t = { 
    -- [key]   = value 
    [10]    = "ten", -- number key, string value 
    ["print function"] = print, -- string key, function value 
    ["sub table"]  = {}, -- string key, table value 
    [print]   = 111, -- function key, number value 
    foo    = 123, -- string key, number value 
} 
+0

[= [[imprimir] = 111, - clave de tabla, valor numérico] =] debe ser la tecla de función :) – daurnimator

+0

¡Buena respuesta!la clave de impresión sería una tecla de función, aunque ... – jpjacobs

+0

@ jpjacoms, daurnimator: ¡Correcto! Incluí específicamente por esa razón. Copiar y pegar y olvidar error de edición. Fijo. – Mud

Cuestiones relacionadas