调用setfenv函数时,Lua环境中调用函数。

我有一个 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

有没有一种方法可以使所有调用传播到环境,而不必对我想要添加到 env 的每个函数都执行 setfenv(基本上,使示例中的最后一次调用 g() 返回 7 而不是 5)呢?

使用 Lua 5.1。

点赞
用户1847592
用户1847592

你可以编写一个函数,使其在每次调用时自动更改自己的环境变量。

-- 这段代码适用于 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 }

-- 继承本次调用的环境变量
f()    --> 1
-- 设置特定环境变量的调用
f(env) --> 2
f()    --> 1

或者,在只使用 Lua 5.1 并且始终要继承环境的情况下,简单的使用 setfenv(1, getfenv(2))

2015-10-14 10:17:07