【Lua进阶系列】之深拷贝与浅拷贝

                         【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的元表设置成新表的元表。这样就完成了整个深克隆的过程了。

 

 

   好,今天的分享就到这里,祝各位功力渐长平步青云,谢谢大家~~

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值