zoukankan      html  css  js  c++  java
  • (原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(3): 深度克隆clone()

    先上一段代码:

    local tbl = { ["a"] = 1, ["b"] = 2 }
    local cpy = tbl
    
    for k, v in pairs( tbl ) do 
        print( "tab: " .. k .. ":".. v )  -- 打印tbl里的元素值
    end
    
    for k, v in pairs( cpy ) do 
        print( "cpy: " .. k .. ":".. v )  -- 打印cpy里的元素值
    end

    打印结果为:

    tab: a:1
    tab: b:2
    cpy: a:1
    cpy: b:2

    cpy获得了tbl中的所有元素,这个没有问题...(小白:没有问题你说毛线...)
    看下面的代码:

    local tbl = { ["a"] = 1, ["b"] = 2 }
    local cpy = tbl
    
    for k, v in pairs( cpy ) do 
        cpy[k] = k  -- 将元素重新赋值
    end
    
    for k, v in pairs( cpy ) do 
        print( "cpy: " .. k .. ":".. v )  -- 打印cpy里的元素值
    end
    
    for k, v in pairs( tbl ) do 
        print( "tab: " .. k .. ":".. v )  -- 打印tbl里的元素值
    end
    
    
    输出:
    cpy: a:a
    cpy: b:b
    tab: a:a
    tab: b:b

    (小白:tbl输出为什么是这样的???)
    上面的输出是没有错的,lua中table的赋值是引用,所以当cpy中的元素的值改变时,tbl也跟着改变。同理,改变tbl中元素的值,cpy的值也会跟着改变,大家可以自己试下。

    (小白:我不想让tbl跟着改变,呜呜呜~~~)

    大家别理上面这货。。。有什么方法能让copy过来的tbl各自独立呢,这就是本章要讲的深度拷贝方法clone。

    激动人心的时刻就要到来,大家准备好了吗...(小白:准备你妹,赶紧的~~~)

    --[[
    -- 深度克隆一个值
    -- example:
    -- 1. t2是t1应用,修改t2时,t1会跟着改变
        local t1 = { a = 1, b = 2, }
        local t2 = t1
        t2.b = 3    -- t1 = { a = 1, b = 3, } == t1.b跟着改变
        
    -- 2. clone() 返回t1副本,修改t2,t1不会跟踪改变
        local t1 = { a = 1, b = 2 }
        local t2 = clone( t1 )
        t2.b = 3    -- t1 = { a = 1, b = 3, } == t1.b不跟着改变
        
    -- @param object 要克隆的值
    -- @return objectCopy 返回值的副本
    --]]
    function clone( object )
        local lookup_table = {}
        local function copyObj( 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[copyObj( key )] = copyObj( value )
            end
            return setmetatable( new_table, getmetatable( object ) )
        end
        return copyObj( object )
    end
    local tbl = { ["a"] = 1, ["b"] = 2 }
    local cpy = clone(tbl)  -- 使用克隆方法
    
    for k, v in pairs( cpy ) do 
        cpy[k] = k  -- 将元素重新赋值
    end
    
    for k, v in pairs( cpy ) do 
        print( "cpy: " .. k .. ":".. v )  -- 打印cpy里的元素值
    end
    
    for k, v in pairs( tbl ) do 
        print( "tab: " .. k .. ":".. v )  -- 打印tbl里的元素值
    end
    
    输出:
    cpy: a:a
    cpy: b:b
    tab: a:1     -- tbl元素值没有改变
    tab: b:2     -- tbl元素值没有改变

    大家可以看到,tbl的元素值没有跟着改变。(小白:...)

    本章到此结束,希望对大家有帮助~

    星月倾心贡献~~^_^~!

    作者使用 cocos2d-x 3.0 + lua学习和工作心得,未经作者允许,请勿转载!在此谢谢各位手下留情~~~

    本文没有获得作者本人同意,不得转载,否则必追究相关责任。转载请注明出处!!~~

    原文地址:http://www.cnblogs.com/wodehao0808/p/4015699.html

  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4015699.html
Copyright © 2011-2022 走看看