lua深拷贝 实现及分享

什么是深拷贝

什么是深拷贝,先来谈谈浅拷贝

当一个类中没有显示地声明一个拷贝构造函数,那么编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝,位拷贝又称浅拷贝。浅拷贝会带来数据安全方面的隐患,这时候的拷贝相当于对对象的变量进行了一系列简单地复制操作,即把数据对应的引用进行拷贝,当用拷贝的引用去修改(写入)操作时,源对象的数据就有可能被篡改。

深拷贝的出现就是为了解决浅拷贝带来的问题

深拷贝有两种实现方式:层层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深拷贝大家有什么好的想法或者意见欢迎留言,感谢查看本次分享~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

斗乐八神

你的鼓励将是我最大的支持~

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

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

打赏作者

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

抵扣说明:

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

余额充值