【问题标题】:Using table keys with periods in Lua在 Lua 中使用带句点的表键
【发布时间】:2011-09-23 16:49:54
【问题描述】:

在 Lua 中,使用指定键分配表可能如下所示:

a = { x = 4 }

...或者也许像...

a = { ['x'] = 4 }

很简单。但是,如果我在键中引入句点(如在域名中),似乎没有任何效果。以下全部失败:

a = { "a.b.c" = 4 }
a = { a.b.c = 4 }
a = { ['a.b.c'] = 4 }
a = { ["a.b.c"] = 4 }
a = { [a.b.c] = 4 }

所有这些都返回相同的错误:

$ ./script.lua
/usr/bin/lua: ./script.lua:49: `}' expected near `='

我在这里缺少什么?有几个例子看起来很简单,应该可以工作(而其他例子有明显的问题)。

【问题讨论】:

  • 至少有两个示例应该在 Lua 中工作。 ({ ['a.b.c'] = 4 } 和 { ["a.b.c"] = 4 })。

标签: lua key lua-table


【解决方案1】:

在 lua 表中的元素可以是名称或表达式。引用语言参考,“Lua 中的名称(也称为标识符)可以是任何由字母、数字和下划线组成的字符串,而不是以数字开头。”,在此上下文中,其他所有内容都被解释为标识符。因此,a.b.c 作为表索引被视为表达式,对其求值以获得实际表索引。这会起作用,但没用:

a = { b = { c = 1 } }
x = {}
x['a.b.c'] = 7

print(x['a.b.c'])

另请注意,foo.a.b.c 等于 foo['a']['b']['c'] 而不是 foo['a.b.c']

【讨论】:

  • 另一张海报直击问题 - “你的脚本还有什么问题吗?” - 但这是最​​完整的答案。不知何故,在把上面的例子放在一起时,有些东西坏了。答案取决于["a.b.c.d"]['a.b.c.d'] 是作为表键的字符串文字,而[a.b.c.d] 是作为表键的值a.b.c.d
【解决方案2】:
a = { ['a.b.c'] = 4 }
a = { ["a.b.c"] = 4 }

这两个都是有效的。

a = { [a.b.c] = 4 }

可能有效,具体取决于所使用的确切标识符。例如

b = { c = { d = "Ohai!" } } }
a = { [b.c.d] = 4 }

将是有效的。

如果您的解释器告诉您它们无效,那么您要么做错了其他事情,要么解释器中存在错误。然而,其他的将是无效的。

【讨论】:

    【解决方案3】:

    你的脚本还有什么问题吗?

    $ ./lua
    Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
    > a = { ["a.b.c"] = 4 }
    > print (a["a.b.c"])
    4
    > print (a.a)
    nil
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 2021-06-15
      • 2021-05-26
      • 1970-01-01
      • 2015-03-14
      • 2015-03-06
      • 2014-05-01
      • 2012-09-22
      相关资源
      最近更新 更多