首页 文章

lua oop深刻复制一张 table

提问于
浏览
1

我的深拷贝代码:

function deepcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
    copy = {}
    for orig_key, orig_value in next, orig, nil do
        copy[deepcopy(orig_key)] = deepcopy(orig_value)
    end
    setmetatable(copy, deepcopy(getmetatable(orig)))
else -- number, string, boolean, etc
    copy = orig
end
return copy
end

我正在尝试使用 self 来实现这一点,但到目前为止还没有尝试过

function block:deepcopy()
local orig_type = type(self)
local copy
if orig_type == 'table' then
    copy = {}
   for orig_key, orig_value in next, self, nil do
       copy[self:deepcopy(orig_key)] = deepcopy(orig_value)
   end
   setmetatable(copy, self:deeepcopy(getmetatable(self)))
else
    copy = orig
end
return copy

1 回答

  • 0

    在函数的OOP版本中,使用方法语法(冒号)的_56920不能达到您想要的效果 . 它相当于 self.deepcopy(self, something) ;第二个参数 something 被忽略,你最终试图反复重复复制相同的 self ,直到堆栈溢出 . 你必须用 self.deepcopy(something) 做一个点来传递 something 作为 self 参数(被复制的参数) .

    deepcopy 方法的定义中调用 self.deepcopy 假定每个子表都具有 self.deepcopy 函数 . 如果没有,您将收到"attempt to call a nil value"错误 . 但是,如果您希望每个子表都有自己的 deepcopy 版本,则可以执行此操作,该版本在复制该表的直接子项(键,值,元表)时使用 . 例如,您可以有一个子表,其 deepcopy 方法不会复制元表 . 以下是子表具有相同 deepcopy 方法的基本版本:

    local block = {}
    
    function block:deepcopy()
        if type(self) == 'table' then
            local copy = {}
            for key, value in pairs(self) do
                copy[self.deepcopy(key)] = self.deepcopy(value)
            end
            return setmetatable(copy, self.deepcopy(getmetatable(self)))
        else
            return self
        end
    end
    
    block.a = { a = 10, deepcopy = block.deepcopy }
    block:deepcopy() -- works
    
    block.a = { a = 10 }
    block:deepcopy() -- error: "attempt to call a nil value (field 'deepcopy')"
    

    但是你根本不需要重写函数来以面向对象的方式使用它 . 尝试使用 deepcopy 的第一个定义 . 执行 object.deepcopy = deepcopy ,然后调用 object:deepcopy() ,您将获得该对象的副本 .

相关问题