Lua:使用字符串键创建隐式表-为什么要使用额外的括号?

Lua:使用字符串键创建隐式表-为什么要使用额外的括号?,lua,Lua,假设您想要创建一个Lua表,并且它的所有键都是有效的Lua标识符。然后可以使用key=value语法: local niceTable = { I=1, like=1, this=1, syntax=1 } local operators = { ['*']="Why", ['+']="the", ['/']="brackets", ['?']='?' } 但是,如果字符串无法“识别”,则必须使用['key']=value语法: local niceTable = { I=1, like=1

假设您想要创建一个Lua表,并且它的所有键都是有效的Lua标识符。然后可以使用
key=value
语法:

local niceTable = { I=1, like=1, this=1, syntax=1 }
local operators = { ['*']="Why", ['+']="the", ['/']="brackets", ['?']='?' }
但是,如果字符串无法“识别”,则必须使用
['key']=value
语法:

local niceTable = { I=1, like=1, this=1, syntax=1 }
local operators = { ['*']="Why", ['+']="the", ['/']="brackets", ['?']='?' }

我对此有点困惑。那些支架在那里干什么?它们是什么意思?

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

local niceTable = {}
niceTable.I = 1;
niceTable.like = 1;
local operators = {}
operators['*'] = "Why";
operators['+'] = "The";
第二种形式等于

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是变量,而不是标识符。

索引表的常规语法是
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
}

[=[[print]=111,--表键,数值]=]应该是函数键:)@jpjacoms,daurnimator:没错!我特别是因为这个原因才加入的。复制粘贴并忘记编辑错误。修正。两个答案都很好,但DeadMG来得稍早一点-我要把这个给他。但是+1代表你的泥浆!因此,这基本上是一种区分“var值”和“var值”的句法方法:)谢谢你的回答,我想我现在明白了。我想我更喜欢Ruby的方式(它总是需要完整的键,没有快捷键,但是有一个可识别字符串的快捷语法)世界上最好的语法糖