Lua中使用方括号包围表键的作用是什么?

14

我发现有些表格的键周围带有方括号:

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

方括号可以省略吗?


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tom Blodget
2个回答

20

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


如果你有一个带有奇数键的表格,例如["键名"] ... 那么此时你将无法使用点符号检索值?你必须使用table["键名"]吗? - hamobi
是的,没错。然而,那不是一个“奇怪的键”。对于旨在模拟结构体的表格,点号表示法对于易用性很重要。对于更像关联数据数组的表格,表示法是无关紧要的。 - Nicol Bolas
只是一个小问题,但是nil并不是唯一的无法使用的索引。 - warspyking
@warspyking:Lua 5.1只接受nil;5.2+将浮点NaN添加到该列表中,原因显而易见。 - Nicol Bolas
@Nicol 我认为值得提到 NaN。而且我在 5.1 中似乎也无法使用 NaN :P - warspyking

2

你不能省略括号

> 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

方括号被用作一种通用的键创建方式,它们使您能够将任何可散列对象用作键 - 不仅限于字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接