我遇到了按键周围有方括号的表格:
local commands_json =
{
["request"] = {
["application"] = PW_APPLICATION,
["push_token"] = deviceToken
}
}
方括号可以省略吗?
这只是在表中指定键的长形式。您可以在
[]
之间放置任何值(nil
除外。以及浮点 NaN)。而没有它们,您只能使用标识符。
例如,这是一个编译错误,因为
key name
不是标识符(由于空格):
tbl =
{
key name = 5,
}
相比之下,以下示例确实有效:
tbl =
{
["key name"] = 5,
}
以下带引号且不带方括号的示例是编译错误:
tbl =
{
"key name" = 5,
}
如果 Lua 看到这样的裸值,它会认为您正在尝试添加到表的数组部分。也就是说,它混淆了:
tbl =
{
"key name",
}
这将创建一个 1 元素数组,其中
tbl[1]
等于 "key name"
。通过使用 []
,编译器可以轻松判断出您想要的东西是键而不是数组元素的值。
长格式还可以让您区分:
local name = "foobar";
tbl =
{
["name"] = 5,
[name] = 7,
}
第二部分意味着计算表达式
name
,其结果将是关键。所以这张桌子有键 "name"
和 "foobar"
。
不能省略括号
> x = { 'a' = 1 }
stdin:1: '}' expected near '='
正确的代码是
> x = { ['a'] = 1 }
> print(x['a'])
1
或
> x = { a = 1 }
> print(x['a'])
1
但是,第二种也有其局限性。如果你想要一个名为“-”的键怎么办?
> x = { - = 1 }
stdin:1: unexpected symbol near '='
> x = { '-' = 1 }
stdin:1: '}' expected near '='
正确的方法是使用括号
> x = { ['-'] = 1 }
> print(x['-'])
1
或者您想创建一个包含在名为 a
的变量
中的名称字段?
> a = 'cat'
> x = { [a] = 1 }
> print(x['cat'])
1
括号用作键创建的一般形式,它们使您能够将任何可哈希对象作为键 - 不仅仅是字符串。