Lua 切换有什么大不了的setfenv()
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 时,可以直接访问上值。)从我所写的内容来看,5.2 方法似乎不太灵活。
In his Lua 5.2 的新奇之处 http://www.inf.puc-rio.br/~roberto/talks/novelties-5.2.pdf,罗伯托写道:
“作为语法糖,比旧环境简单多了”
简单在哪里?我忽略了什么?
我相信这个主题值得比 5.2 用户手册中给出的更好的处理。
简单在哪里?
这取决于你如何定义“简单”。
在 Lua 5.1 中,环境是一种神奇、神秘的设置,与系统中的任何其他设置不同。它没有明确的位置,只能通过使用标准库功能来设置。
在 Lua 5.2 中,环境是variable,就像其他任何一样。它有一个您可以使用的名称。所以它更简单,因为发生的事情更明显。
此外,在Lua 5.1中,函数的环境可以动态改变。
在 Lua 5.2 中,除了直接的上值操作之外,一旦函数拥有一个环境,那就是它永久拥有的环境。函数的环境是继承的,像常规函数一样具有词法作用域local
多变的。因此,如果您查看代码,您可以轻松了解函数所在的环境。如果没有local _ENV
在该函数创建的范围内,则环境应为块的环境(由load
call).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)