• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

(原创)cocos2d-x3.0+lua学习和工作(4):公共函数(3):深度克隆clone() ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

先上一段代码:

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua"引用表"的清空发布时间:2022-07-22
下一篇:
在lua环境中使用protobuf发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap