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

猜你喜欢

转载自blog.csdn.net/weixin_44737486/article/details/118021022