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)
上一篇:网络组建


下一篇:GIS矢量切片算法