lua深拷貝和淺拷貝的區別,以及實現深拷貝


淺拷貝
在 Lua 中,使用賦值運算符 "=" 進行淺拷貝的時候,分兩種情況:

1、拷貝對象的類型是 string、number、boolean 這些基本類型的時候,會進行復制,創建一個新的對象,拷貝出來的對象和原來的對象互不影響,所以修改拷貝出來的對象的值不會影響到原來的對象的值!

2、拷貝對象的類型是 table 的時候,則是直接進行引用,拷貝出來的對象和原來的對象實際上是同一個對象,所以修改拷貝出來的對象中的元素的值也會使原來的對象中元素的值發生改變!

深拷貝

深拷貝需要遞歸拷貝table中的所有元素及設置元表,測試函數如下:

local function clone(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = {}
lookup_table[object] = new_table
for key, value in pairs(object) do
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end

-- test
local deepCopyTest1 = {a = 1, b = 2, c = { d = 3, e = 4, f = { g = 5, h = 6,} } }
local deepCopyTest2 = clone(deepCopyTest1)
deepCopyTest2.b = 99
deepCopyTest1.c.f.g=10
print(deepCopyTest1.b,deepCopyTest2.c.f.g)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM