因此,我有一个Lua脚本,可以在其中设置功能的环境并定义在该环境中可用的其他功能。问题是,当我调用在其上执行了setfenv
的函数时,它在环境中调用的任何函数都使用全局_G
环境来查找值,而不是在调用初始函数时设置的环境。我在下面复制了这个问题:
> function f() print(t) end
> t = 5
> f()
5
> env = {}
> env['print'] = print
> env['t'] = 7
> env['f'] = f
> setfenv(f, env)
> f()
7
> setfenv(f, _G)
> f()
5
> function g() f() end
> g()
5
> setfenv(g, env)
> g()
5
有没有一种方法可以让环境传播到所有调用,而不必对我要添加到
setfenv
的每个函数进行env
(基本上,这样示例中对g()
的最后一次调用将返回7
而不是5
)?使用Lua 5.1。
最佳答案
您可以编写一个函数,使其在每次调用时自动更改其自身的环境
-- This code works on Lua 5.1, 5.2, 5.3
local getfenv = getfenv or function() end
local setfenv = setfenv or getfenv
a = 1
function f(env)
local _ENV = env or getfenv(2) or _ENV; setfenv(1, _ENV)
print(a)
end
env = { a = 2, print = print }
-- inherit environment for this call
f() --> 1
-- set special environment for this call
f(env) --> 2
f() --> 1
或者,如果您仅使用Lua 5.1,并且希望始终继承环境,则可以简单地使用
setfenv(1, getfenv(2))
。