lua中表键周围的方括号的功能是什么?

lua中表键周围的方括号的功能是什么?,lua,lua-table,Lua,Lua Table,我偶然发现一些表的键周围有方括号: local commands_json = { ["request"] = { ["application"] = PW_APPLICATION, ["push_token"] = deviceToken } } 方括号可以省略吗?不能省略方括号 > x = { 'a' = 1 } stdin:1: '}' expected near '='

我偶然发现一些表的键周围有方括号:

local commands_json =
{
    ["request"] = {
        ["application"] = PW_APPLICATION,
        ["push_token"] = deviceToken
    }
}

方括号可以省略吗?

不能省略方括号

> x = { 'a' = 1 }
stdin:1: '}' expected near '='
> x = { ['-'] = 1 }
> print(x['-'])
1
正确的代码是

> x = { ['a'] = 1 }
> print(x['a'])
1

然而,第二种方法也有其局限性。如果您想要一个名为“-”的键,该怎么办

同样,正确的方法是使用括号

> x = { 'a' = 1 }
stdin:1: '}' expected near '='
> x = { ['-'] = 1 }
> print(x['-'])
1
或者您想创建一个名字段,该字段包含在名为
a
变量中

> a = 'cat'
> x = { [a] = 1 } 
> print(x['cat'])
1

括号用作键创建的一般形式,它使您能够将任何可哈希对象作为键,而不仅仅是字符串。

它只是在表中指定键的长形式。您可以将任何值置于
[]
之间(除了
nil
和浮点NaN)。而如果没有它们,则只能使用标识符

例如:

tbl =
{
  key name = 5,
}
这是一个编译错误,因为“key name”不是标识符(由于空格)。这项工作:

tbl =
{
  ["key name"] = 5,
}
这是:

tbl =
{
  "key name" = 5,
}
也是一个编译错误。如果Lua看到这样一个裸值,它会认为您正试图添加到表的数组部分。也就是说,它混淆了:

tbl =
{
  "key name",
}
它创建一个1元素数组,其中
tbl[1]
等于
“key name”
。通过使用
[]
,编译器可以很容易地判断出您想要的是一个键,而不是数组元素的值

长表单还允许您区分:

local name = "a name";

tbl =
{
  ["name"] = 5,
  [name] = 7,
}

第二部分的意思是计算表达式
name
,其结果将是键。所以这个表有键“name”和“a name”。

如果你有一个表有一个像[“key name”]这样的奇数键。。。那么在那一点上,你就不能再使用点符号来检索值了?你必须去桌上[“键名”]?是的,没错。然而,这不是一个“奇怪的关键”。对于拟模拟结构的表,
符号对于易于使用非常重要。对于更像关联数据数组的表,符号是不相关的。只是吹毛求疵,但nil不是唯一不可用的索引。@warspyking:lua5.1只例外
nil
;5.2+将浮点NaN添加到该列表中,原因显而易见。@Nicol我认为值得一提NaN。而且我似乎也不能在5.1中使用NaN:也许文档中说的最好:。换句话说,键值是在运行时确定的。