Lua解构并且没有功能

时间:2013-12-04 23:53:58

标签: function oop object lua null

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

这是我的问题,是否有解决方案(或完成此类的正确方法)?

function k(o)
    o = nil
end

o = 20
print(o) --> 20

k(o)
print(o) --> 20, should be nil

3 个答案:

答案 0 :(得分:1)

你想做的事情不能在函数中完成,因为Lua按值传递参数。您必须使用直接分配。

答案 1 :(得分:1)

如果您将变量放在(全局)环境中而不是用“local”声明它们,可以通过将它们的名称传递给函数来设置它们。

---[[ if lua < 5.2
  local _ENV = _G
---]]

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

o = 20
print(o) --> 20

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

通常,当您想要更改成员时,您需要其容器和索引。

答案 2 :(得分:0)

在Lua中,对象被垃圾收集,因此您无法控制&#34;解构&#34; (也称为终结或垃圾收集;在c ++中称为破坏,但这并不完全相同)。

所以这取决于你想要做什么,但如果你试图释放o所持有的资源,那么将o设置为nil是不够的,因为如果任何其他表或模块都引用了o,那么将不会最终确定。你可以添加一个&#34; finalize&#34;它的方法并调用它,但是你需要验证你的代码的其他部分是否尊重这个&#34; finalization&#34;合同:通过检查o的每种方法来确保它尚未最终确定。

例如,如果o有一个方法&#34; init&#34;初始化一个新实例,一个方法&#34; doSomething&#34;做某事,方法&#34;敲定&#34;释放资源,然后在o:finalize()set&#34; self.finalized = true&#34;并在o:doSomething()put&#34;如果self.finalized然后错误(&#34;消息&#34;)结束&#34;。