浅拷贝

在lua中,使用“=”进行浅拷贝,根据拷贝对象的不同,又分为两种情况:

1.拷贝对象为string、number、boolean等基础类型时,拷贝的过程是进行复制粘贴。创建一个新的对象,拷贝出来的新对象和原来的对象互不影响,互不干涉,所以修改拷贝出来的对象的值不会影响到原来的对象的值!

local value_A=10
local value_B=value_A
print("A的值:"..value_A)
print("B的值:"..value_B)
value_B=5
print("A的值:"..value_A)
print("B的值:"..value_B)

输出结果

A的值:10
B的值:10
A的值:10
B的值:5

2.拷贝对象的类型为table,拷贝出来的对象和拷贝前的实际上是同一个对象,占同一个内存,简单点说就是一个人的两个名字。如果改变了拷贝出来对象的值,原对象也会随之改变。

local tab={}
tab["aaa"]="自强"for k,v in pairs(tab) doprint(k.."对应的账号:"..v)
endlocal temp=tab
temp["aaa"]="爱上游戏开发"for k,v in pairs(tab) doprint("拷贝前的对象:"..k.."对应的账号:"..v)
end
for k,v in pairs(temp) doprint("拷贝后的对象:"..k.."对应的账号:"..v)
end

输出结果

aaa对应的账号:自强
拷贝前的对象:aaa对应的:爱上游戏开发
拷贝后的对象:aaa对应的:爱上游戏开发

深拷贝

如果想修改拷贝后的对象的值,使原对象不受影响,那么就要采用深拷贝了。

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

function TableDeepCopy(targetTab)if targetTab == nil thenreturn nilendif type(targetTab) ~= "table" thenreturn targetTabendlocal new_tab = {}local mt = getmetatable(targetTab)if mt ~= nil thensetmetatable(new_tab, mt)endfor i, v in pairs(targetTab) doif type(v) == "table" thennew_tab[i] = TableDeepCopy(v)elsenew_tab[i] = vendendreturn new_tab
endlocal tab = {}
tab.abc = 123
local ss = TableDeepCopy(tab)
ss.abc = 111
print(tab.abc)
print(ss.abc)

输出结果

123
111

Lua的浅拷贝和深拷贝相关推荐

  1. lua踩坑之浅拷贝与深拷贝

    文章目录 一.前言 二.浅拷贝和深拷贝 三.浅拷贝 1.拷贝对象为string.number.boolean等基础类型时 2.拷贝对象的类型为table类型时 三.深拷贝 一.前言 先来说说·,为什么 ...

  2. Java中的浅拷贝与深拷贝

    一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...

  3. js之浅拷贝和深拷贝

    js数据类型主要分基本数据类型和引用数据类型.前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 1.js内存 js内存,或者说大 ...

  4. 43 JavaScript中的浅拷贝与深拷贝

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.浅拷贝与深拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. 深拷贝拷贝多层,每 ...

  5. 【进阶4-1期】详细解析赋值、浅拷贝和深拷贝的区别

    一.赋值(Copy) 赋值是将某一数值或对象赋给某个变量的过程,分为下面 2 部分 基本数据类型:赋值,赋值之后两个变量互不影响 引用数据类型:赋址,两个变量具有相同的引用,指向同一个对象,相互之间有 ...

  6. C# 之String以及浅拷贝与深拷贝

    C# 之String以及浅拷贝与深拷贝  一.String到底是值类型还是引用类型 MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原 ...

  7. C# 浅拷贝与深拷贝区别 解惑篇

    问题起源: 昨天被同事问到一个浅拷贝与深拷贝区别的问题,说实在的,记得在学校时在书在看过相关概念区别. 只是,那时的在校生,又有几个能对书本上那写的尽量让鬼都看不懂知识能清晰的理解呢. 工作后虽然也有 ...

  8. clone是深拷贝还是浅拷贝_Cloneable接口的作用与探索理解浅拷贝与深拷贝

    导读:本文将主要讨论设计模式--原型模式中,关于cloneable接口及浅拷贝与深拷贝的概念. 原型模式的理解 关于原型模式的理解,我在网上发现一个有趣且助于理解原型模式的例子在这里分享一下:火影忍者 ...

  9. Java的浅拷贝与深拷贝总结

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

最新文章

  1. golang中的fallthrough
  2. mysql hourminute_mysql日期函数(时间函数)
  3. WCF开发框架形成之旅--WCF应用常见问题处理
  4. 解决webpack 打包出现额外的xxxx.LICENSE.js文件
  5. Vue插件_自己封装插件_以及使用自定义插件---vue工作笔记0017
  6. 软中断网卡处理Linux高性能外部设备处理机制SMP
  7. Picasso 图片库图片渐显效果的实现
  8. 访问量100万的网站服务器,100万访问量 服务器配置
  9. 如何设置vs2005的环境变量
  10. Selenium和Firefox对应版本
  11. 搜狗linux 命令行,linux 安装搜狗输入法非caodan命令行方式
  12. 腾讯2016实习生招聘后台研发面试经
  13. 1.19.5.3.时态表、关联一张版本表、关联一张普通表、时态表、声明版本表、声明版本视图、声明普通表、时态表函数等
  14. 理财投资理念黄金法则
  15. 拨号服务器应用场景有哪些?
  16. 负数在计算机中的储存方式
  17. c语言之圆的周长、面积、圆球的体积--改良版
  18. 微信小程序routeDone错误问题
  19. 03.fourier transform(傅立叶变换)
  20. 毛星云opencv之第10章总结--摘抄

热门文章

  1. 脱机运行scp linux,解决CentOS使用不了scp命令
  2. python from win32com import client 出现弹框 隐藏模块中出现编译错误
  3. 被奇安信青睐的火绒 究竟有着怎样的魔力?
  4. 正则表达式-校验 Ip地址 Mac地址 端口 经纬度 车牌号码
  5. 留学生最常用最全的五个英文文献检索网站
  6. EasyCVR通过进程启动无报错,但是自动退出该如何解决?
  7. 我在周日凌晨执意顶着困意喝酒
  8. linux下使用命令行将informix数据库表导出.unl文件
  9. 杯具”箴言成网络流行语
  10. USB设备驱动程序-USB Gadget Driver(四)