如何将lua关键字用作表键?

问题

当我将do作为表的键时,它会给出以下错误:

> table.newKey = { do = 'test' }
stdin:1: unexpected symbol near 'do'
>

我需要将do用作键。我该怎么办?

点赞
用户107090
用户107090

使用以下语法:

t = { ['do'] = 'test' }

或者使用 t['do'] 来获取或设置一个值。

2021-04-01 17:49:17
用户7396148
用户7396148

sometable.somekeysometable['somekey']的语法糖,

同样,{ somekey = somevalue }{ ['somekey'] = somevalue }的语法糖。


像这样的信息可以在这个非常好的资源中找到:

对于这样的需求,有另一种更一般的格式。在这个格式中,我们在方括号之间明确地写出要初始化为表达式的索引:

opnames = {["+"] = "add", ["-"] = "sub",
           ["*"] = "mul", ["/"] = "div"}

-- 《Lua 程序设计》3.6 - 表构造器

2021-04-01 17:49:58
用户2858170
用户2858170

我需要使用 do 作为关键字。我该怎么办?

阅读 Lua 5.4 参考手册,并了解类似 t = { a = b } t.a = b 只有在 a 是一个有效的 Lua 标识符的情况下才有效。

3.4.9 - 表构造器

构造器的一般语法为

tableconstructor ::= ‘{’ [fieldlist] ‘}’

fieldlist ::= field {fieldsep field} [fieldsep]

field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp

fieldsep ::= ‘,’ | ‘;’

形如 name = exp 的 field 等价于 ["name"] = exp

那么为什么 do 不起作用呢?

3.1 - 词法规范

Lua 中的名称(也称为标识符)可以是任何由拉丁字母、阿拉伯数字和下划线组成的字符串,不能以数字开头,也不能是保留字。标识符用于命名变量、表字段和标签。

以下关键字是保留的,不能用作名称:

 and       break     do        else      elseif    end
 false     for       function  goto      if        in
 local     nil       not       or        repeat    return

do 不是一个名称,因此您需要使用 field ::= ‘[’ exp ‘]’ ‘=’ exp 语法,即在您的例子中是 table.newKey = { ['do'] = 'test' }

2021-04-03 12:59:24