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

  • 相关阅读:
    mysqldump --skip-tz-utc
    mysql 时间格式转换 DATE_FORMAT
    redis setinel 启动就 sdown
    virtualbox 1059m 布置1G虚拟机
    virtualbox 扩展磁盘空间
    tar gzip 压缩效率比较
    堆表 索引组织表
    内核参数 kernel.shmmax
    utf8mb4 字符集能正常存储表情
    源码包中带 boost 和 不带 boost
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4015699.html
Copyright © 2011-2022 走看看