And*_*rei 2 oop lua class 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
Run Code Online (Sandbox Code Playgroud)
正如Nicol所说,一旦变量获得对象的引用,对象本身就无法控制变量(即将其值设置为nil).实际上,这是一件好事 - 想象有人在某处保存了对您的引用对象的局部变量.突然在一个未知的时刻,它成为一个零引用(因为它在其他地方被破坏),并且任何进一步访问它都会导致错误.
这是一个无赖,我需要立即销毁对象.
你真的需要销毁这个物体吗?为什么?是不是Lua垃圾收集器正确地完成了它的工作?是不是有另一种方法来设计对象之间的关系?
例如,在最简单的情况下,您可以强制执行垃圾回收collectgarbage("collect").垃圾收集将清除所有没有强引用的对象.如果你真的想要变量消失,请将它们保存在弱表中.当然,Lua会在你分配对象时自动进行垃圾收集(除非你停止它).您还可以修改垃圾回收的速度.