这是期望的效果:
-- in module: A
module(...)
require('B')
new_func('my_val') -- new_func is defined in "B"
-- in module: B
module(...)
getfenv(2).new_func = function () end -- this does not work
-- this does
getfenv(2).A.new_func = function () end
这比实际需要更具好奇心。我希望通过这个深奥的问题更多地了解getfenv
所做的事情。
由于getfenv(2)
应该返回一个env,为什么getfenv(2).new_func
在上面的例子中不起作用?
我也不明白为什么getfenv(1) from A ~= getfenv(2) in B
。
(我还想避免使用debug
,包括debug.setupvalue)
答案 0 :(得分:1)
module
将全局环境设置为由其第一个参数命名的表。因此,模块“B”中定义的任何内容都在名为B的表中,然后在package.loaded["B"]
运行时安装在require
中。这就是为了更改环境,您必须使用模块名称作为getfenv
返回的表的索引。
您可以在“旧方式”下找到此信息here。
答案 1 :(得分:0)
我想我知道问题是什么:require
不符合我的想法:
-- in A.lua
require("b")
-- That is not the same as:
(function (mod_name)
-- run B.lua
end)("b")
require
在全局环境中运行块:https://stackoverflow.com/a/18311328/841803
因此,getfenv(2)
如果在开场问题中使用,则会返回getfenv(0)
。
您必须在A:
调用的B函数中使用getfenv
-- module A
module(...)
require("b").import()
new_func("some val")
-- module B
module(...)
function new_func(val)
print(val)
end
function import ()
getfenv(2).new_func = new_func
end