【问题标题】:LUA delete all objects from a classLUA 从一个类中删除所有对象
【发布时间】:2017-03-23 22:55:17
【问题描述】:

需要遍历下面类创建的所有对象,并在它们变得无用后销毁它们;

Casing = {}
Casing.__index = Casing
sentArray = {}
function Casing.create(x, y, z)
    if x ~= nil and y ~= nil and z ~= nil then
        local _casing = {}
        setmetatable(_casing,Casing)
        --etc.
        return _casing
    end
end

编辑(答案):

这个问题的问题很简单:没有必要明确解构或销毁变量。 Lua 会自动销毁未使用的变量并相应地取消引用它们——如下面的答案所示。 p>

【问题讨论】:

  • 您可以详细描述这段代码的作用、您缺少的部分和/或不起作用的部分
  • 我不知道如何从这个特定的类中删除所有对象,这就是它的全部内容。我需要遍历类的索引并销毁所有对象并保持函数完好无损。
  • 该代码不会创建对象集合,因此无需运行任何内容。似乎也没有任何“删除”或“销毁”功能(除非它被 --etc. 省略)
  • 我已经根据您可能想要的内容写了一个答案。如果这不是您要查找的内容,那么您将需要准确定义“无用”和“破坏”这两个术语的含义,因为这个问题在 Lua 术语中有点不合常规。

标签: class object lua


【解决方案1】:

Lua 中的表受 GC 约束。当所有引用变得“无用”时,只需放弃所有引用,除非您关闭垃圾收集,否则它们的“销毁”会自然而然地发生。

手动对表进行 GC 的示例:

local mytable = {}

print(mytable)
print(collectgarbage('count'))

mytable = nil

collectgarbage()
print(collectgarbage('count'))

--[[stdout (approximation):
  table: 0x7fa821c066f0
  23.7412109375
  22.81640625
]]

如果您想保留您创建的实例的记录,您可以将对它们的引用存储在一个表中。简单地从表中删除它们将导致 GC 清理它们,假设没有保存其他引用。

像这样天真的事情:

local my_instances = {}

local function create_instance ()
    local t = {}

    my_instances[#my_instances + 1] = t

    return t
end

local function destroy_instances ()
    for i = 1, #my_instances do
        my_instances[i] = nil
    end
end

或者,您可以创建一个弱表,这样您就可以对程序中仍然具有外部引用的任何实例进行操作。再一次,当此表之外的所有引用都丢失时,GC 将启动。

local my_instances = setmetatable({}, {
    __mode = 'k'
})

local function create_instance ()
    local t = {}

    my_instances[t] = true

    return t
end

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2015-07-26
    • 2021-07-24
    相关资源
    最近更新 更多