lua踩坑系列之淺拷貝與深拷貝
阿新 • • 發佈:2020-07-28
推薦閱讀:
前言
先來說說·,為什麼突然談及到淺拷貝和深拷貝這個問題。因為時間緊任務重,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
愛上游戲開發
愛上游戲開發