问题描述
我意识到,当我尝试使用_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
无效。