lua踩坑之浅拷贝与深拷贝
Posted 森明帮大于黑虎帮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua踩坑之浅拷贝与深拷贝相关的知识,希望对你有一定的参考价值。
文章目录
一、前言
先来说说·,为什么突然谈及到浅拷贝和深拷贝这个问题。因为时间紧任务重,lua零基础参与项目研发,没有系统学过lua,对于lua里面的坑,差不多该踩的,能踩的,我踩了,或者即将去踩了。这不,本现实就是,它来了(坑),由于系统模块比较大,牵扯到的数据比较多,开发的时候也没太注重数据的统一,数据出现了,只能大海捞针去找问题。
二、浅拷贝和深拷贝
对于拷贝这个问题,lua和其他很多语言像C++一样,也分为浅拷贝和深拷贝。
三、浅拷贝
在lua中,使用“=”进行浅拷贝,根据拷贝对象的不同,又分为两种情况:
1.拷贝对象为string、number、boolean等基础类型时
拷贝对象为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)
print("\\n")
输出结果:
2.拷贝对象的类型为table类型时
拷贝对象的类型为table,拷贝出来的对象和拷贝前的实际上是同一个对象,占同一个内存,简单点说就是一个人的两个名字。如果改变了拷贝出来对象的值,原对象也会随之改变。
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)
print("\\n")
local tab1=
tab1["csdn"]="森明帮大于黑虎帮"
tab1["抖音"]="废物"
tab1["qq"]="1234567890"
for k,v in pairs(tab1) do
print(k.."对应的账号:"..v)
end
for k,v in pairs(tab1) do
print("拷贝前的对象:"..k.."对应的账号:"..v)
end
local temp1=
temp1=tab1
temp1["csdn"]="笨鸟下蛋"
temp1["抖音"]="游戏开发"
for k,v in pairs(tab1) do
print("拷贝后的对象:"..k.."对应的账号:"..v)
end
print("temp1的地址:",temp1)
print("tab1的地址:",tab1)
print("\\n")
输出结果:
对于table类型,如果想修改拷贝后的对象的值,使原对象不受影响,那么就要采用深拷贝了。
三、深拷贝
Lua中没有提供这样的api的,那就自己封装一个函数,递归拷贝table中所有元素以及设置元表即可!如下:
function clone(master)
local temp2 =
for k, v in pairs(master) do
if type(v) == "table" then
temp2[k] = clone(v)
else
temp2[k] = v
end
end
return temp2
end
使用方法:
function clone(master)
local temp2 =
for k, v in pairs(master) do
if type(v) == "table" then
temp2[k] = clone(v)
else
temp2[k] = v
end
end
return temp2
end
local tab2=
tab2["csdn"]="森明帮大于黑虎帮2222"
tab2["抖音"]="废物1111"
tab2["qq"]="77777"
local temp2=
temp2["csdn"]="笨鸟下蛋222"
temp2["抖音"]="游戏开发222"
temp2=clone(tab2)
for k,v in pairs(tab2) do
print("拷贝前的对象:"..k.."对应的账号:"..v)
end
for k,v in pairs(tab2) do
print("拷贝后的对象:"..k.."对应的账号:"..v)
end
print("temp2的地址:",temp2)
print("tab2的地址:",tab2)
输出结果:
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系以上是关于lua踩坑之浅拷贝与深拷贝的主要内容,如果未能解决你的问题,请参考以下文章