Lua的淺拷貝和深拷貝

2021-10-10 16:33:36 字數 1734 閱讀 9253

在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)

endlocal temp=tab

temp["aaa"]="愛上遊戲開發"

for k,v in pairs(tab) do

print("拷貝前的物件:"..k.."對應的賬號:"..v)

endfor 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

endif type(targettab) ~= "table" then

return targettab

endlocal new_tab = {}

local mt = getmetatable(targettab)

if mt ~= nil then

setmetatable(new_tab, mt)

endfor i, v in pairs(targettab) do

if type(v) == "table" then

new_tab[i] = tabledeepcopy(v)

else

new_tab[i] = v

endend

return new_tab

endlocal tab = {}

tab.abc = 123

local ss = tabledeepcopy(tab)

ss.abc = 111

print(tab.abc)

print(ss.abc)

123

111

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...