2010-12-22 70 views
12

假设你想创建一个Lua表,并且它的所有关键字都是有效的lua标识符。然后你可以使用key=value语法:Lua:使用字符串键创建隐式表 - 为什么额外的括号?

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

然而,如果你的字符串是不是“身份”,那么你必须使用['key']=value语法:

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

我有点困惑这个问题。那里有什么括号?他们的意思是什么?

回答

18

他们将包含的字符串标识为结果表中的键。第一种形式,你可以考虑为等于

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

第二种形式是等于

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

不同的是纯粹的语法糖的,除非第一个使用标识符,所以它必须遵循标识符规则(例如,不以数字和解释时间常量开头),第二种形式使用任何旧字符串,因此可以在运行时确定,例如,以及不是合法标识符的字符串。但是,结果基本相同。括号的需要很容易解释。

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

这里,var是标识符,而不是变量。

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

这里,VAR是变量,而不是标识符。

+0

因此,它基本上是一种区分“var的值”和“var value”的句法方式:)感谢您的回答,我认为我现在知道了。我认为我更喜欢Ruby的做事方式(它总是需要完整的密钥,没有快捷方式,但有可识别字符串的快捷方式) – kikito 2010-12-24 03:25:55

17

索引表的正常语法是t[val]。仅对于字符串键,Lua提供备用语法,其中t.foo完全等效于t["foo"]。这纯粹是一种语法上的便利,即所谓的“语法糖”。它不添加功能,它只是给你一个更简单的使用字符串作为命名字段的语法。

有很多串钥匙,这将不工作:

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 

基本上,如果字符串键将是一个有效的标识符才有效。

再次,表是通过[]索引,并且在大多数情况下,你需要使用:只有当你使用一个字符串键这将工作作为一个有效的标识符(无空格

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 
} 

,包含只有单词字符,数字或下划线,并且不以数字开头)可以使用快捷方式语法。对于上表,这将只是'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

[= [[print] = 111, - table key,number value] =] 应该是功能键:) – daurnimator 2010-12-23 08:19:00

相关问题