浅拷贝
在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) do
print(k.."对应的账号:"..v)
end
local temp=tab
temp["aaa"]="爱上游戏开发"
for k,v in pairs(tab) do
print("拷贝前的对象:"..k.."对应的账号:"..v)
end
for k,v in pairs(temp) do
print("拷贝后的对象:"..k.."对应的账号:"..v)
end
输出结果
aaa对应的账号:自强
拷贝前的对象:aaa对应的:爱上游戏开发
拷贝后的对象:aaa对应的:爱上游戏开发
深拷贝
如果想修改拷贝后的对象的值,使原对象不受影响,那么就要采用深拷贝了。
Lua中没有提供这样的api的,那就自己封装一个函数,递归拷贝table中所有元素,如果有元表则设置元表即可!
function TableDeepCopy(targetTab)
if targetTab == nil then
return nil
end
if type(targetTab) ~= "table" then
return targetTab
end
local new_tab = {}
local mt = getmetatable(targetTab)
if mt ~= nil then
setmetatable(new_tab, mt)
end
for i, v in pairs(targetTab) do
if type(v) == "table" then
new_tab[i] = TableDeepCopy(v)
else
new_tab[i] = v
end
end
return new_tab
end
local tab = {}
tab.abc = 123
local ss = TableDeepCopy(tab)
ss.abc = 111
print(tab.abc)
print(ss.abc)
输出结果
123
111