lua踩坑系列之浅拷贝与深拷贝

举报
爱上游戏开发 发表于 2022/07/01 22:30:35 2022/07/01
3.5k+ 0 0
【摘要】 推荐阅读:  我的CSDN 我的博客园 QQ群:704621321 我的个人博客 前言 先来说说·,为什么突然谈及到浅拷贝和深拷贝这...

推荐阅读:

前言

先来说说·,为什么突然谈及到浅拷贝和深拷贝这个问题。因为时间紧任务重,lua零基础参与项目研发,没有系统学过lua,对于lua里面的坑,差不多该踩的,能踩的,我踩了,或者即将去踩了。这不,本来周五准时下班,然后愉快的度过一个双休。梦想总是美好的,现实就是,它来了(坑),由于系统模块比较大,牵扯到的数据比较多,开发的时候也没太注重数据的统一,数据出现了,只能大海捞针去找问题。

浅拷贝和深拷贝

对于拷贝这个问题,lua和其他很多语言一样,分为浅拷贝和深拷贝。

浅拷贝

在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["csdn"]="懒人下蛋"
tab["抖音"]="shirln"
tab["微信公众号"]="懒人下蛋"
tab["QQ群"]="704621321"

for k,v in pairs(tab) do
	print(k.."对应的账号:"..v)
end

local temp=tab
temp["csdn"]="爱上游戏开发"
temp["微信公众号"]="爱上游戏开发"

for k,v in pairs(tab) do
	print("拷贝前的对象:"..k.."对应的账号:"..v)
end
for k,v in pairs(temp) do
	print("拷贝后的对象:"..k.."对应的账号:"..v)
end

  
 

输出结果:

csdn对应的账号:懒人下蛋
QQ群对应的账号:704621321
微信公众号对应的账号:懒人下蛋
抖音对应的账号:shirln

拷贝前的对象:csdn对应的账号:爱上游戏开发
拷贝前的对象:QQ群对应的账号:704621321
拷贝前的对象:微信公众号对应的账号:爱上游戏开发
拷贝前的对象:抖音对应的账号:shirln

拷贝后的对象:csdn对应的账号:爱上游戏开发
拷贝后的对象:QQ群对应的账号:704621321
拷贝后的对象:微信公众号对应的账号:爱上游戏开发
拷贝后的对象:抖音对应的账号:shirln

  
 

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

深拷贝

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

function clone(master)
    local temp = {}
    for k, v in pairs(master) do
        if type(v) == "table" then
            temp[k] = clone(v)
        else
            temp[k] = v
        end
    end
    return temp
end

  
 

使用方法:

local tab={}
tab["csdn"]="爱上游戏开发"
tab["抖音"]="shirln"
tab["微信公众号"]="爱上游戏开发"
tab["QQ群"]="704621321"

local temp=clone(tab)
prring(temp)

  
 

输出结果

704621321
shirln
爱上游戏开发
爱上游戏开发

  
 

文章来源: unity3d.blog.csdn.net,作者:爱上游戏开发,版权归原作者所有,如需转载,请联系作者。

原文链接:unity3d.blog.csdn.net/article/details/106171415

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。