美文网首页
Lua-浅拷贝与深拷贝(转)

Lua-浅拷贝与深拷贝(转)

作者: 祝你万事顺利 | 来源:发表于2019-05-31 10:15 被阅读0次

    浅拷贝

    在Lua中,使用赋值运算符"="进行浅拷贝的时候,分两种情况:

    1、拷贝对象的类型是string、number、boolean这些基本类型的时候,会进行复制,创建一个新的对象,拷贝出来的对象和原来的对象互不影响,所以修改拷贝出来的对象的值不会影响到原来的对象的值!

    2、拷贝对象的类型是table的时候,则是直接进行引用,拷贝出来的对象和原来的对象实际上是同一个对象,所以修改拷贝出来的对象中的元素的值也会使原来的对象中元素的值发生改变!

    -- number
    local numTest1 = 5
    local numTest2 = numTest1  -- string、number、boolean这些基本类型使用"="会进行复制
    numTest2 = 10  -- 修改numTest2的值,numTest1的值不会被修改
    print(numTest1)
    -- 5
     
    -- string
    local strTest1 = "hello world!"
    local strTest2 = strTest1
    strTest2 = "hello China!"
    print(strTest1)
    -- hello world!
     
    -- table
    local tblTest1 = {a = 1, b = 2, c = 3}
    local tblTest2 = tblTest1  -- table使用"="进行的是引用
    tblTest2.b = 99  -- 修改tblTest2中元素的值,tblTest1中对应元素的值也会被修改
    print(tblTest1.b)
    -- 99
    
    

    深拷贝

    那么问题来了:如果我现在想要table也实现深拷贝该如何操作呢?

    Lua中是没有提供这样的api的,那就自己封装一个函数,递归拷贝table中所有元素以及设置元表即可!如下:

    -- Lua table deep copy
    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)
    end
    -- test
    local deepCopyTest1 = {a = 1, b = 2, c = 3}
    local deepCopyTest2 = clone(deepCopyTest1)
    deepCopyTest2.b = 99
    print(deepCopyTest1.b)
    

    原文:https://blog.csdn.net/fightsyj/article/details/85055342

    相关文章

      网友评论

          本文标题:Lua-浅拷贝与深拷贝(转)

          本文链接:https://www.haomeiwen.com/subject/hktwtctx.html