Lua 中方括号在表键周围的作用是什么?

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

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

方括号可以省略吗?

点赞
用户2658050
用户2658050

你不能省略大括号

> 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

括号被用作键的通用形式,它们赋予你以任何可散列对象作为键的能力-不仅仅是字符串。

2016-01-08 23:04:51
用户734069
用户734069

这只是在表格中指定键的长形式。你可以在[]之间放置任何值(除了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”这两个键。

2016-01-08 23:06:00