1. 程式人生 > 實用技巧 >lua踩坑系列之淺拷貝與深拷貝

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
愛上游戲開發
愛上游戲開發