Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Lua元表类析构函数_Oop_Class_Lua_Metatable - Fatal编程技术网

Oop Lua元表类析构函数

Oop Lua元表类析构函数,oop,class,lua,metatable,Oop,Class,Lua,Metatable,我有下面的Lua元表类,如何向它添加析构函数,以便在特定条件到达时,它将析构函数创建的对象并将其值设置为nil ------------------------------------------------- -- Arrow class ------------------------------------------------- local arrow = {} local arrow_mt = { __index = arrow } -- metatable function a

我有下面的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

你不能。Lua不是C/C++;它使用垃圾收集。因此,你必须依靠垃圾收集;对象的用户可以控制对象何时离开。这取决于他们在处理完后是否放弃对它的引用


因此,虽然您可以有一个明确的“new”(虽然您不应该这样称呼它),但您不能有一个明确的“delete”。当对象不再被引用时,就会发生破坏。

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

这太糟糕了,我需要马上销毁这个东西

你真的需要摧毁这个物体吗?为什么?Lua垃圾收集器的工作是否正确?难道没有其他方法来设计对象之间的关系吗


例如,在最简单的情况下,您可以通过
collectgarbage(“collect”)
强制垃圾收集。垃圾收集将清理所有没有强引用的对象。如果真的想让变量消失,请将它们保存在一个文件夹中。当然,Lua将在您分配对象时自动执行垃圾收集(除非您停止它)。你也可以。

@andreeib:为什么?你在做什么,需要马上销毁?这听起来很像C/C++的想法。依赖垃圾收集器吗?我不喜欢它听起来的样子。我在Java中“依赖”GC时有一些不好的经验。无论您是否有过不好的经验,这是您唯一的选择。与Java一样,Lua不允许显式管理内存。可以选择接受GC,也可以不使用Lua