你可以稍加努力。如果您的变量child
是真正的上值,您可以将它们“链接”到scope
函数中的值。如果它们是全局变量(这里似乎就是这种情况),您可以将它们映射到使用setfenv
局部变量的值并使用该环境填充的环境。
以下将abc
按照您的预期打印(您可以更改loadstring
为loadfile
具有相同的效果):
function vars(f)
local func = debug.getinfo(f, "f").func
local i = 1
local vars = {}
while true do
local name, value = debug.getlocal(f, i)
if not name then break end
if string.sub(name, 1, 1) ~= '(' then vars[name] = value end
i = i + 1
end
i = 1
while func do -- check for func as it may be nil for tail calls
local name, value = debug.getupvalue(func, i)
if not name then break end
vars[name] = value
i = i + 1
end
return vars
end
function parent()
local var = "abc"
local child = loadstring("print(var)")
local env = vars(2) -- grab all local/upvalues for the current function
-- use these values to populate new environment; map to _G for everything else
setmetatable(env, {__index = _G})
setfenv(child, env)
child()
end
parent()
这一切都适用于 Lua 5.1,但在 Lua 5.2 中也是可能的。