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

why we need to use double quotes to call the index of the global variable _G?

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

无效:

varname = 5

print(_G[varname]) -- nil

但这行得通:

varname = 5

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

为什么需要这些引用?它是否将 table _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是有效的variable-name。如果你想用 space 的字符串索引 table 例如:table['hello world'],那么你可以 not 使用等价的符号; table.hello world 无效。