为什么需要使用双引号来调用全局变量_G的索引?

我意识到当我尝试使用_G变量来分析全局变量时,我需要在索引中使用双引号来查找变量,例如:

它不起作用:

varname = 5

print(_G[varname]) -- nil

但是这个起作用:

varname = 5

print(_G["varname"]) -- 5

为什么需要这些引号?它是否将变量存储在表_G中,例如"varname" = varname?

点赞
用户2607597
用户2607597

以下是您提供的代码,未使用引号时的操作:

varname = 5
print(_G[varname]) --> << varname >> 解析为 << 5 >>

变为:

varname = 5
print(_G[5]) --> _G [5] 解析为 << nil >>,因为全局表中没有这样的键 << 5 >>

变为:

varname = 5
print(nil) --> 打印 << nil >>,因为它是 nil

如您所见,您正在访问 _G[varname]varname 是一个 标识符(变量名),它被评估为 _整数值 5_。

当您使用引号时,“varname” 是一个 字符串,不再是标识符,它被评估为字符串值 "varname"。

_G [“varname”] 等同于编写 _G.varname,在此代码中已定义:

varname = 5
print(_G["varname"])

等同于:

varname = 5
print(_G.varname)

在此上下文中,它等同于:

varname = 5
print(varname)

变为:

varname = 5
print(5)

规则是 table ['identifier_string'] 可以写作 table.identifier_string,因为 identifier_string 是一个有效的变量名。如果您想要使用具有空格的字符串索引表,例如:table ['hello world'],则无法使用等效符号;table.hello world 是无效的。

2020-08-24 19:16:12