Lua:setfenv()与_ENV

时间:2012-08-18 19:07:41

标签: lua

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

在各种“What's New”来源中,这一举动被认为是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方法似乎不太灵活。

在他的The Novelties of Lua 5.2中,罗伯托写道:

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

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

我认为这个主题值得在5.2用户手册中给出更好的处理。

2 个答案:

答案 0 :(得分:9)

  

哪里简单?

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

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

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

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

在Lua 5.2中,除了直接upvalue操作之外,一旦一个函数有一个环境,那就是它将永远存在的环境。函数的环境是继承的,其词法作用类似于常规local变量。因此,如果查看代码,您可以轻松查看函数所处的环境。如果在该函数的创建范围内没有local _ENV,则环境应该是块的环境(已定义)通过load电话)。

答案 1 :(得分:5)

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