【问题标题】:What is the function of square brackets around table keys in lua?lua中表键周围的方括号有什么作用?
【发布时间】:2021-02-11 22:17:34
【问题描述】:

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

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

方括号可以省略吗?

【问题讨论】:

标签: lua lua-table


【解决方案1】:

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

例如:

tbl =
{
  key name = 5,
}

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

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

还有这个:

tbl =
{
  "key name" = 5,
}

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

tbl =
{
  "key name",
}

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

长格式还可以让您区分:

local name = "a name";

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

第二部分是计算表达式name,其结果将是关键。所以这个表有键“name”和“a name”。

【讨论】:

  • 如果你有一个像 ["key name"] 这样的奇数键的表......那么此时你将不再能够使用点符号检索该值?你必须去 table["key name"] ??
  • 是的,没错。但是,这不是“奇数键”。对于旨在模仿结构的表,. 表示法对于易用性很重要。对于更像关联数据数组的表,符号是无关紧要的。
  • 只是吹毛求疵,但 nil 并不是唯一不可用的索引。
  • @warspyking: 好吧,Lua 5.1 只除了nil; 5.2+ 将浮点 NaN 添加到该列表中,原因很明显。
  • @Nicol 我认为值得一提的是 NaN。而且我似乎也不能在 5.1 中使用 NaN :P
【解决方案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

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

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2016-06-04
    • 1970-01-01
    • 2021-12-13
    • 2016-04-21
    相关资源
    最近更新 更多