Lua 的析构函数和通过函数设置为 nil。

我想在 Lua 中“解构”(如果这是正确的单词)我的对象。

以下是我的问题,是否有解决方案(或正确的完成方式)?

function k(o)
    o = nil
end

o = 20
print(o) --> 20

k(o)
print(o) --> 20,应该是 nil
点赞
用户107090
用户107090

因为 Lua 是通过值传递参数的,所以您想要做的事情无法在函数中完成。您必须使用直接赋值。

2013-12-04 23:58:21
用户34799
用户34799

如果你没有使用 "local" 声明变量,将它们放在(全局)环境中,你可以通过将它们的名称传递给函数来设置它们。

---[[ 如果 lua < 5.2
  local _ENV = _G
---]]

function k(n)
  _ENV[n] = nil
end

o = 20
print(o) --> 20

k('o')
print(o) --> nil

通常来说,当你想要改变一个成员时,你需要知道它所在的容器和索引。

2013-12-05 00:44:03
用户869951
用户869951

在 Lua 中,对象是通过垃圾回收进行管理的,因此您无法控制“析构”(也称为finalization或垃圾回收;在 C++ 中称为destruction,但这并不完全相同)。

因此,这取决于您想要做什么,但如果您试图释放o持有的资源,则仅将o设置为nil是不够的,因为如果任何其他表或模块引用o,则它将不会被finalize。您可以向其添加一个“finalize”方法并调用该方法,但然后您需要验证您代码的其他部分是否遵守此“finalization”合同:通过在o的每个方法中放置检查,以确保它尚未被finalize。

例如,如果o有一个“init”方法来初始化一个新实例,一个“doSomething”方法来执行某些操作,以及一个“finalize”方法来释放资源,则在o:finalize()中设置“self.finalized = true”,并在o:doSomething()中放置“if self.finalized then error(“message”)end”。

2013-12-05 12:59:51