在两个模块中,是否可以添加函数来获取getfenv(2)?

这是所期望的效果:

-- 在模块 A 中
module(...)
require('B')

new_func('my_val') -- new_func 定义在 "B" 中

-- 在模块 B 中
module(...)
getfenv(2).new_func = function () end  -- 这行不起作用

-- 这行可以
getfenv(2).A.new_func = function () end

这只是出于好奇,没有实际需求。我希望通过这个玄学问题学到更多关于 getfenv 做什么的知识。

既然 getfenv(2) 应该返回一个环境,为什么在上面的例子中 getfenv(2).new_func 没有起作用?

我也不明白为什么从 A 中的 getfenv(1) 与在 B 中的 getfenv(2) 不相等。

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

点赞
用户841803
用户841803

我认为我知道问题出在哪里了:require不是我所认为的那样:

-- 在 A.lua 中
require("b")

-- 这不同于:
(function (mod_name)
  -- 运行 B.lua
end)("b")

require在全局环境中运行代码块:https://stackoverflow.com/a/18311328/841803

因此,在打开的问题中使用getfenv(2)将返回getfenv(0)

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

-- 模块A
module(...)
require("b").import()
new_func("some val")

-- 模块B
module(...)

function new_func(val)
  print(val)
end

function import ()
  getfenv(2).new_func = new_func
end
2013-08-19 08:27:18
用户1997006
用户1997006

module 设定全局环境为由其第一个参数命名的表。因此,定义在模块 "B" 中的任何东西都存储在名为 B 的表中。当 require 运行时,这个表被安装在 package.loaded["B"] 中。这就是为什么要改变环境,必须使用模块名作为 getfenv 返回的表中的索引的原因。

您可以在这里的“旧方法”下找到此信息。

2013-08-19 08:38:44