有两个脚本文件,脚本如下
//parent.lua
function scope()
local var = "abc"
require "child"
end
//child.lua
print(var)
这样,child.lua 将打印 nil 值,因为 Parent.lua 中的范围不会向模块公开其本地功能。我认为会的,因为 require 指令是在这个范围内并且在 var 声明之后声明的。我的愿望是将子代的所有行几乎完全注入到父代中。子脚本只是为了更好的可读性而导出。我怎样才能传递本地范围? loadfile() 不起作用,dofile() 也不起作用。函数环境 fenv 不包含本地值。 debug.setlocal() 似乎无法创建新变量(它还需要子级中的接收器)。除了重新编译脚本还有什么方法吗?
只要稍加努力就可以。如果你的变量在child
是真正的高价值,你可以将它们“链接”到你的价值scope
功能。如果它们是全局变量(这里似乎是这种情况),您可以使用将它们映射到环境setfenv
并使用本地变量中的值填充该环境。
将打印以下内容abc
正如你所期望的(你可以改变loadstring
to 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 中也是可能的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)