lua踩坑系列之淺拷貝與深拷貝

推薦閱讀:

前言

先來說說·,爲什麼突然談及到淺拷貝和深拷貝這個問題。因爲時間緊任務重,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
愛上游戲開發
愛上游戲開發
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章