Lua metatable类析构函数

时间:2011-12-05 21:32:32

标签: oop class lua metatable

我有以下Lua metatable类,如何向它添加析构函数,以便在某个条件到达时它会破坏创建的对象并将其值设置为nil?

-------------------------------------------------
-- Arrow class
-------------------------------------------------

local arrow = {}
local arrow_mt = { __index = arrow } -- metatable

function arrow.new(x, y) -- constructor
    local newArrow = {
        position = { x = x, y = y }
    }

    return setmetatable( newArrow, arrow_mt )
end

function arrow:remove()
    -- remove the object here
    -- self = nil dosent work
end

2 个答案:

答案 0 :(得分:5)

正如Nicol所说,一旦变量获得对象的引用,对象本身就无法控制变量(即将其值设置为 nil )。实际上,这是一个好东西 - 想象某个地方某个地方保存了对象的引用,并将其作为局部变量。突然在一个未知的时刻,它变成了 nil 引用(因为它在其他地方被破坏),并且任何进一步的访问都会导致错误。

  

这是一个无赖,我需要立即销毁这个物体。

你真的需要销毁这个物体吗?为什么?是不是Lua垃圾收集器正确地完成了它的工作?是不是有另一种方法来设计对象之间的关系?

例如,在最简单的情况下,您可以通过collectgarbage("collect")强制进行垃圾回收。垃圾收集将清除所有没有引用的对象。如果确实希望变量消失,请将它们保存在weak table中。当然,Lua会在你分配对象时自动进行垃圾收集(除非你停止它)。您还可以modify the speed of garbage collection

答案 1 :(得分:1)

你做不到。 Lua不是C / C ++;它使用垃圾收集。因此,你必须依靠垃圾收集;对象的用户可以控制它何时消失。当他们完成它时,他们应该放弃对它的引用。

因此,虽然你可以有一个明确的“新”(虽然你不应该这样称呼它),但你没有明确的“删除”。当对象不再被引用时,将发生破坏。