【Lua进阶系列】之深拷贝与浅拷贝
大家好,我是Lampard~~
欢迎来到Lua进阶系列的博客
前文再续,书接上一回。今天和大家讲解一下lua中深拷贝与浅拷贝以及代码的解读
一.首先什么是深拷贝什么浅拷贝?
lua中我们使用 = 来进行浅拷贝,使用函数clone()来进行深拷贝
如果拷贝的对象里的元素只有值(string、number、boolean等基础类型),那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象。如果是一个表的话,则浅拷贝拷贝出来的对象和拷贝前的实际上是同一个对象,占同一个内存,而深拷贝才创建出一个新的内存,一个新的对象。
具体的例子我们可以参考一下这位博主的示例:
二.解读深拷贝源码
function clone(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = {}
lookup_table[object] = new_table
for key, value in pairs(object) do
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object) -- 返回clone出来的object表指针/地址
end
lua中clone的源代码十分简短,但是如果第一次看的话还是比较容易看懵
local num = clone(123)
我们如果传进去的对象不是表类型的话,那么我们就会直接把这个值return出去,然后再利用=号进行一次浅拷贝,上文提过如果是数值类型的话,浅拷贝也会生成一个对象。那么如果如果传的object是一个表类型的话,则递归去把object中的key, value复制到一个新创建的表中,最后再把object的元表设置成新表的元表。这样就完成了整个深克隆的过程了。