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用户手册中给出更好的处理。
答案 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的环境更简单,但不是很好。