Lua:setfenv()与_ENV

pet*_*zik 12 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
Run Code Online (Sandbox Code Playgroud)

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

在他的Lua 5.2的新奇事物中,罗伯托写道:

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

简约在哪里?我忽略了什么?

我相信这个主题值得在5.2用户手册中给出更好的处理.

Nic*_*las 9

简约在哪里?

这取决于你如何定义"简单".

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

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

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

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


Pup*_*ppy 5

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

  • 在加载函数后更改函数的环境不是"常规功能"; 它打破了功能封装的概念.设置_ENV正常的所有情况都不需要调试库. (9认同)
  • 您可以使用debug.setupvalue在外部进行设置.如果函数访问其环境,它将继承其父级的_ENV作为upvalue.这是setfenv&getfenv的替代品:http://lua-users.org/lists/lua-l/2010-06/msg00313.html. (6认同)
  • 您不应将调试功能用于常规功能. (4认同)
  • 我发现它是最有用的东西,在Lua 5.1中,它是常规功能.不*每个*函数都应该被封装. (4认同)
  • 确实.但是,能够从外部为Lua函数设置环境非常重要. (2认同)