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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我们在这里获得的是我们已经节省了五个关键击球.(我相信情况与C方面差别不大.)而且,如果我做对了,setfenv()可以从函数的外部和内部使用,而_ENV只能从函数内部访问.(当然,在使用C API时,可以直接访问upvalues.)从我写的内容来看,5.2方法似乎不太灵活.
在他的Lua 5.2的新奇事物中,罗伯托写道:
"作为一种语法糖,它比旧环境简单得多"
简约在哪里?我忽略了什么?
我相信这个主题值得在5.2用户手册中给出更好的处理.
简约在哪里?
这取决于你如何定义"简单".
在Lua 5.1中,环境是一个神奇的,神秘的设置,与系统中的任何其他设置都不同.它没有明确的位置,只能使用标准库功能进行设置.
在Lua 5.2中,环境是一个变量,就像其他任何变量一样.它有一个你可以使用的名称.所以它更简单,因为它更明显是在发生什么.
此外,在Lua 5.1中,函数的环境可以动态改变.
在Lua 5.2中,除了直接upvalue操作之外,一旦一个函数有一个环境,那就是它将永远存在的环境.函数的环境是继承的,在词法范围内像常规local变量一样.因此,如果查看代码,您可以轻松查看函数所处的环境.如果local _ENV在该函数的创建范围内没有,则环境应该是块的环境(由load调用定义).
据我所知,Lua 5.2环境的主要缺陷是它们无法在外部设置 - 即,你不能说setfenv(func, {}).在我看来,这是一个巨大的失败.它确实比Lua 5.1的环境更简单,但不是很好.