gpt4 book ai didi

在 setfenv 函数中调用函数时的 Lua 环境

转载 作者:行者123 更新时间:2023-12-02 03:21:24 25 4
gpt4 key购买 nike

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

最佳答案

你可以写一个函数,让它在每次调用时自动改变它自己的环境

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

或者简单地 setfenv(1, getfenv(2)) 如果您只使用 Lua 5.1 并且希望始终继承环境。

关于在 setfenv 函数中调用函数时的 Lua 环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com