我的深拷贝代码:
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 回答
在函数的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
方法的基本版本:但是你根本不需要重写函数来以面向对象的方式使用它 . 尝试使用
deepcopy
的第一个定义 . 执行object.deepcopy = deepcopy
,然后调用object:deepcopy()
,您将获得该对象的副本 .