什么是深拷贝
什么是深拷贝,先来谈谈浅拷贝
当一个类中没有显示地声明一个拷贝构造函数,那么编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝,位拷贝又称浅拷贝。浅拷贝会带来数据安全方面的隐患,这时候的拷贝相当于对对象的变量进行了一系列简单地复制操作,即把数据对应的引用进行拷贝,当用拷贝的引用去修改(写入)操作时,源对象的数据就有可能被篡改。
深拷贝的出现就是为了解决浅拷贝带来的问题
深拷贝有两种实现方式:层层clone的方法和利用串行化来做深拷贝。层层clone的方法:在浅拷贝的基础上实现,给引用类型的属性添加克隆方法,并且在拷贝的时候也实现引用类型的拷贝。利用串行化来做深拷贝:为避免复杂对象中使用clone方法可能带来的混乱,可以先将对象写到流里,再从流里读出来。
lua实现深拷贝
这次采用利用串行化实现深拷贝
代码:
-- 深拷贝方法
function deepCopy(obj)
local lookUpTable = {}
local _copy
_copy = function(copyObj)
-- 非table数据直接返回原基本数据
if type(copyObj) ~= "table" then
return copyObj
end
-- table数据
-- 已查找的table直接返回,不要重复迭代了
if lookUpTable[copyObj] then
return lookUpTable[copyObj]
end
-- 记录为已查找的table
local newTable = {}
lookUpTable[copyObj] = newTable
-- 迭代拷贝
for k, v in pairs(copyObj) do
-- 考虑k,v为table的情况
newTable[_copy(k)] = _copy(v)
end
-- 复制元表元素
return setmetatable(newTable, getmetatable(copyObj))
end
local result = _copy(obj)
return result
end
最后
这次深拷贝的实现参考了来自IT业界某位前辈的作品。关于lua深拷贝大家有什么好的想法或者意见欢迎留言,感谢查看本次分享~