Lua元表类析构函数

我有以下Lua元表类,如何向其中添加一个析构函数,使得当某个条件到达时,它将解除创建的对象并将它的值设置为nil?

-------------------------------------------------
-- 箭头类
-------------------------------------------------

local arrow = {}
local arrow_mt = { __index = arrow } -- 元表

function arrow.new(x, y) -- 构造函数
    local newArrow = {
        position = { x = x, y = y }
    }

    return setmetatable( newArrow, arrow_mt )
end

function arrow:remove()
    -- 在此处移除对象
    -- self = nil不起作用
end

原文链接 https://stackoverflow.com/questions/8392168

点赞
stackoverflow用户734069
stackoverflow用户734069

你无法进行显式的“删除”操作,因为 Lua 采用垃圾回收机制,与 C/C++ 不同。因此,你必须依赖垃圾回收机制;当用户不再需要该对象时,他们将控制该对象何时被废弃。当对象不再被引用时,它将被销毁。因此,尽管你可以显式地创建一个对象(虽然不应该这样称呼它),但不能显式地删除它。

2011-12-05 22:01:26
stackoverflow用户221509
stackoverflow用户221509

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

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

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

例如,在最简单的情况下,你可以通过collectgarbage(“collect”) 强制进行垃圾收集。垃圾收集将清理所有没有强引用的对象。如果你 真的想让变量消失,将它们保存在一个weak表中。当你分配对象时,Lua会自动进行垃圾收集(除非你停止它)。你还可以修改垃圾回收的速度

2011-12-06 15:20:46