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

问题描述

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

它不起作用:

varname = 5

print(_G[varname]) -- nil

但这可行:

varname = 5

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

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

解决方法

这是运行提供的代码(不带引号)时发生的情况:

varname = 5
print(_G[varname]) --> << varname >> resolves to << 5 >>

成为:

varname = 5
print(_G[5]) --> _G[5] resolves to << nil >> because there is no such key << 5 >> in the global table

成为:

varname = 5
print(nil) --> Prints << nil >> because it is,nil.

如您所见,您正在访问_G[varname]varname是一个identifier(变量名),其值为整数值5

使用引号时,"varname"string,不再是标识符,它被评估为字符串值“ 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'],则可以 not 使用等效的符号; table.hello world无效。