我发现有些表格的键周围带有方括号:
local commands_json =
{
["request"] = {
["application"] = PW_APPLICATION,
["push_token"] = deviceToken
}
}
方括号可以省略吗?
这只是在表格中指定键的长格式。你可以在 []
之间放置任何值(除了 nil
和浮点数NaN)。如果没有它们,你只能使用标识符。
例如:
tbl =
{
key name = 5,
}
这是一个编译错误,因为“key name”不是标识符(由于空格)。这样可以解决:
tbl =
{
["key name"] = 5,
}
还有这个:
tbl =
{
"key name" = 5,
}
这也是编译错误。如果Lua看到像这样的裸值,它会认为你正在尝试添加到表的数组部分。也就是说,它会将其与以下内容混淆:
tbl =
{
"key name",
}
这将创建一个只有一个元素的数组,其中tbl[1]
等于"key name"
。通过使用[]
,编译器可以轻松地知道您是要创建一个键而不是数组元素的值。
长格式还允许您区分:
local name = "a name";
tbl =
{
["name"] = 5,
[name] = 7,
}
第二部分的意思是评估表达式name
,其结果将作为键。因此,该表格具有键“name”和“a name”。
nil
;5.2+将浮点NaN添加到该列表中,原因显而易见。 - Nicol Bolas你不能省略括号
> 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
方括号被用作一种通用的键创建方式,它们使您能够将任何可散列对象用作键 - 不仅限于字符串。