gpt4 book ai didi

Lua:setfenv() 与 _ENV

转载 作者:行者123 更新时间:2023-12-04 00:56:46 26 4
gpt4 key购买 nike

Lua 从 setfenv() 切换有什么大不了的至 _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 时,可以直接访问 upvalues。)从我写的内容来看,5.2 方法似乎不太灵活。

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

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

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

我相信这个主题值得更好地处理,因为它在 5.2 用户手册中给出。

最佳答案

Where's the simplicity?



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

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

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

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

在 Lua 5.2 中,除了直接的 upvalue 操作之外,一旦一个函数有了一个环境,那就是它永远拥有的环境。函数的环境是继承的,像常规 local 一样具有词法范围。变量。所以如果你看你的代码,你可以很容易地看到一个函数在什么环境中。如果没有 local _ENV在该函数的创建范围内,则环境应为块的环境(由 load 调用定义)。

关于Lua:setfenv() 与 _ENV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12021461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com