2

我有以下 Lua 元表类,我怎样才能向它添加一个析构函数,以便当某个条件到达时它会破坏创建的对象并将其值设置为 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
4

2 回答 2

5

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

太糟糕了,我需要立即销毁该对象。

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

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

于 2011-12-06T15:20:46.643 回答
1

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

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

于 2011-12-05T22:01:26.060 回答