博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(3): 深度克隆clone()
阅读量:4349 次
发布时间:2019-06-07

本文共 2324 字,大约阅读时间需要 7 分钟。

先上一段代码:

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

打印结果为:

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

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

看下面的代码:

local tbl = { ["a"] = 1, ["b"] = 2 }local cpy = tblfor k, v in pairs( cpy ) do     cpy[k] = k  -- 将元素重新赋值endfor k, v in pairs( cpy ) do     print( "cpy: " .. k .. ":".. v )  -- 打印cpy里的元素值endfor k, v in pairs( tbl ) do     print( "tab: " .. k .. ":".. v )  -- 打印tbl里的元素值end输出:cpy: a:acpy: b:btab: a:atab: 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  -- 将元素重新赋值endfor k, v in pairs( cpy ) do     print( "cpy: " .. k .. ":".. v )  -- 打印cpy里的元素值endfor k, v in pairs( tbl ) do     print( "tab: " .. k .. ":".. v )  -- 打印tbl里的元素值end输出:cpy: a:acpy: b:btab: a:1     -- tbl元素值没有改变tab: b:2     -- tbl元素值没有改变

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

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

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

 

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

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

原文地址:

转载于:https://www.cnblogs.com/wodehao0808/p/4015699.html

你可能感兴趣的文章
Hdu【线段树】基础题.cpp
查看>>
时钟系统
查看>>
BiTree
查看>>
5个基于HTML5的加载动画推荐
查看>>
水平权限漏洞的修复方案
查看>>
静态链接与动态链接的区别
查看>>
如何使用mysql
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
ajax跨域,携带cookie
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
查看>>