Lua中,字符串键的隐式表创建 - 为什么需要多余的方括号?

假设你想创建一个 Lua table,并且它的所有键都是有效的 Lua 标识符。 那么你可以使用 key=value 语法:

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

然而,如果你的字符串无法“识别”,那么你必须使用 ['key']=value 语法:

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

我有点困惑。 那些括号在那里? 它们是什么意思?

原文链接 https://stackoverflow.com/questions/4514636

点赞
stackoverflow用户298661
stackoverflow用户298661

他们将包含的字符串标识为结果表中的键。第一种形式可以看作等同于

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

2010-12-22 23:29:13
stackoverflow用户501459
stackoverflow用户501459

正常索引表格的语法是 t[val]。 Lua提供了一种_替代_语法,只适用于字符串键,其中t.foot["foo"]完全等效。这纯粹是一种句法便利,所谓的'语法糖'。它不添加功能,只是为使用字符串作为命名字段提供了一个更简洁的语法。

有很多字符串键不能工作:

t["hello_world"] => t.hello_world  -- 正确
t["hello world"] => t.hello world  -- 错误,字符串中有空格
t["5 * 3"]       => t.5 * 3        -- 错误
t['[10]']        => t.[10]         -- 错误

基本上只有当字符串键是有效标识符时才起作用。

再次说明,表格通过[]进行索引,在大多数情况下您需要使用它们:

t = {
   -- [key]           = value
   [10]               = "ten", -- 数字键,字符串值
   ["print function"] = print, -- 字符串键,函数值
   ["sub table"]      = {},    -- 字符串键,表值
   [print]            = 111,   -- 函数键,数字值
   ["foo"]            = 123,   -- 字符串键,数字值
}

只有当您使用的字符串键可以作为有效标识符时(不含空格,仅包含单词字符、数字或下划线,并且不以数字开头),才可以使用快捷语法。对于上面的表格,只有'foo'。

t = {
   -- [key]           = value
   [10]               = "ten", -- 数字键,字符串值
   ["print function"] = print, -- 字符串键,函数值
   ["sub table"]      = {},    -- 字符串键,表值
   [print]            = 111,   -- 函数键,数字值
   foo                = 123,   -- 字符串键,数字值
}
2010-12-22 23:47:39