Lua中将_ENV内名称存入表后,如何打印名称对应的值而非名称本身
问题根因
你遍历_ENV存入TAB1的内容是全局变量的键名字符串(比如"X"、"Y"),不是变量本身的引用。
出现输出字符串"x"的问题有两个核心原因:
- Lua标识符大小写敏感,你定义的是大写
X=123、Y=321,后续写的小写x、y是完全独立的未定义标识符,和你之前定义的X/Y没有关联。 - 你过滤
_ENV的步骤大概率把变量名字符串直接赋值给了小写x/y变量,导致你后续引用x/y拿到的就是字符串本身,而不是对应全局变量的数值。
你之前尝试的gmatch、gsub、tostring都是字符串处理方法,根本解决不了变量索引的问题,属于方向错了。
正确实现方法
通过变量名字符串取全局变量的值,只需要把字符串作为key,到_ENV(也就是全局环境表)中索引即可,不需要额外的字符串处理。
参考修正代码:
X = 123 Y = 321 TAB1 = {} z = 1 -- 内置全局变量黑名单,替换成你自己需要过滤的项即可 local builtin_vars = { _G = true, _ENV = true, pairs = true, ipairs = true, table = true, string = true, print = true, tostring = true, tonumber = true, require = true } for n in pairs(_ENV) do if not builtin_vars[n] then TAB1[z] = n z = z + 1 end end -- 遍历存了变量名的TAB1,从全局环境取对应值存入TAB2 TAB2 = {} for i, var_name in ipairs(TAB1) do TAB2[i] = _ENV[var_name] end print(TAB2[1]) -- 输出123
注意事项
- Lua标识符严格区分大小写,定义变量和引用变量时必须保证大小写完全一致,大写
X和小写x是两个完全无关的变量。 - 动态获取全局变量值的核心逻辑是
_ENV[变量名字符串],不需要对变量名字符串做额外的gmatch、gsub类字符串处理,这类操作不解决变量索引问题。 - 局部变量无法直接通过变量名字符串动态索引,如果需要动态取局部变量的值,需要提前将局部变量存入自定义的映射表中,再通过key索引。
内容的提问来源于stack exchange,提问作者DEMONVIC
相关产品推荐
相关产品推荐

