lua 中 table 键周围方括号的作用是什么?

What is the function of square brackets around table keys in lua?

我遇到了在键周围有方括号的表格:

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

方括号可以省略吗?

不能省略括号

> 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

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

它只是在 table 中指定键的长格式。您可以在 [] 之间放置任何值(nil 和 floating-point NaN 除外)。而没有它们,您只能使用标识符。

例如:

tbl =
{
  key name = 5,
}

这是一个编译错误,因为“键名”不是标识符(由于 space)。这有效:

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

还有这个:

tbl =
{
  "key name" = 5,
}

也是编译错误。如果 Lua 看到这样的裸值,它认为您正在尝试添加到 table 的数组部分。也就是说,它混淆了它:

tbl =
{
  "key name",
}

创建一个 1 元素数组,其中 tbl[1] 等于 "key name"。通过使用 [],编译器可以很容易地判断出您的意思是将某物作为键而不是数组元素的值。

长格式还可以让您区分:

local name = "a name";

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

第二部分表示对表达式name求值,其结果将是关键。所以这个 table 有键“name”和“a name”。