12

setfenv()Lua 从to切换有什么大不了的_ENV

在各种“最新消息”来源中,这一举措被认为是 Lua 5.1 和 5.2 版本之间最重要的变化之一。

但是,PIL 和其他地方给出的示例可以精简为以下内容:

-- Lua 5.1                   -- Lua 5.2
function myfunc()            function myfunc()
    setfenv(1, {})               _ENV = {}
end                          end

到目前为止,我们在这里获得的是我们已经保存了五个击键。(我相信情况和C方面没有太大区别。)此外,如果我做对了,setfenv()可以从函数外部和函数内部使用,而_ENV只能从函数内部访问。(当然,当使用 C API 时,可以直接访问 upvalues。)从我写的内容来看,5.2 的方法似乎不太灵活。

在他的 Lua 5.2 的新奇之处,罗伯托写道:

“作为语法糖,它比旧环境简单得多”

哪里简单了?我忽略了什么?

我相信这个话题值得更好地处理,它在 5.2 用户手册中给出。

4

2 回答 2

9

哪里简单了?

这取决于您如何定义“简单”。

在 Lua 5.1 中,环境是一个神奇而神秘的设置,不同于系统中的任何其他设置。它没有明确的位置,只能使用标准库功能进行设置。

在 Lua 5.2 中,环境是一个变量,就像其他变量一样。它有一个您可以使用的名称。所以它更简单,因为它更明显发生了什么。

此外,在 Lua 5.1 中,函数的环境可以动态更改。

在 Lua 5.2 中,除了直接的 upvalue 操作之外,一旦一个函数有了一个环境,那就是它将永远拥有的环境。函数的环境是继承的,像常规local变量一样在词法范围内。所以如果你看你的代码,你可以很容易地看到一个函数所处的环境。如果local _ENV该函数的创建范围内没有,那么环境应该是块的环境(由load调用定义)。

于 2012-08-19T02:29:51.790 回答
5

据我所知,Lua 5.2 环境的主要缺陷是它们不能在外部设置——也就是说,你不能说setfenv(func, {}). 在我看来,这是一个巨大的失败。它确实比 Lua 5.1 的环境更简单,但不是很好。

于 2012-08-19T02:26:54.653 回答