我有以下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
答案 0 :(得分:5)
正如Nicol所说,一旦变量获得对象的引用,对象本身就无法控制变量(即将其值设置为 nil )。实际上,这是一个好东西 - 想象某个地方某个地方保存了对象的引用,并将其作为局部变量。突然在一个未知的时刻,它变成了 nil 引用(因为它在其他地方被破坏),并且任何进一步的访问都会导致错误。
这是一个无赖,我需要立即销毁这个物体。
你真的需要销毁这个物体吗?为什么?是不是Lua垃圾收集器正确地完成了它的工作?是不是有另一种方法来设计对象之间的关系?
例如,在最简单的情况下,您可以通过collectgarbage("collect")
强制进行垃圾回收。垃圾收集将清除所有没有强引用的对象。如果确实希望变量消失,请将它们保存在weak table中。当然,Lua会在你分配对象时自动进行垃圾收集(除非你停止它)。您还可以modify the speed of garbage collection。
答案 1 :(得分:1)
你做不到。 Lua不是C / C ++;它使用垃圾收集。因此,你必须依靠垃圾收集;对象的用户可以控制它何时消失。当他们完成它时,他们应该放弃对它的引用。
因此,虽然你可以有一个明确的“新”(虽然你不应该这样称呼它),但你没有明确的“删除”。当对象不再被引用时,将发生破坏。