1

这是想要的效果:

-- 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)应该返回一个环境,为什么getfenv(2).new_func在上面的例子中不起作用?

我也不明白为什么getfenv(1) from A ~= getfenv(2) in B

(我也想避免使用debug,包括debug.setupvalue

4

2 回答 2

1

module将全局环境设置为由其第一个参数命名的表。因此,在模块“B”中定义的任何内容都放在名为 B 的表中,然后在运行时安装该package.loaded["B"]require。这就是为什么为了改变环境,你必须使用模块名作为索引返回的表getfenv

您可以在“旧方式”下找到此信息。

于 2013-08-19T08:38:44.893 回答
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)

您必须getfenv在 A 调用的 B 函数中使用:

-- 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
于 2013-08-19T08:27:18.197 回答