当两个都是模块时,是否可以向getfenv(2)添加函数?

时间:2013-08-19 06:58:19

标签: lua

这是期望的效果:

-- 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

2 个答案:

答案 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