浅拷贝
在Lua中,使用赋值运算符"="进行浅拷贝的时候,分两种情况:
1、拷贝对象的类型是string、number、boolean这些基本类型的时候,会进行复制,创建一个新的对象,拷贝出来的对象和原来的对象互不影响,所以修改拷贝出来的对象的值不会影响到原来的对象的值!
2、拷贝对象的类型是table的时候,则是直接进行引用,拷贝出来的对象和原来的对象实际上是同一个对象,所以修改拷贝出来的对象中的元素的值也会使原来的对象中元素的值发生改变!
-- number
local numTest1 = 5
local numTest2 = numTest1 -- string、number、boolean这些基本类型使用"="会进行复制
numTest2 = 10 -- 修改numTest2的值,numTest1的值不会被修改
print(numTest1)
-- 5
-- string
local strTest1 = "hello world!"
local strTest2 = strTest1
strTest2 = "hello China!"
print(strTest1)
-- hello world!
-- table
local tblTest1 = {a = 1, b = 2, c = 3}
local tblTest2 = tblTest1 -- table使用"="进行的是引用
tblTest2.b = 99 -- 修改tblTest2中元素的值,tblTest1中对应元素的值也会被修改
print(tblTest1.b)
-- 99
深拷贝
那么问题来了:如果我现在想要table也实现深拷贝该如何操作呢?
Lua中是没有提供这样的api的,那就自己封装一个函数,递归拷贝table中所有元素以及设置元表即可!如下:
-- Lua table deep copy
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 = 3}
local deepCopyTest2 = clone(deepCopyTest1)
deepCopyTest2.b = 99
print(deepCopyTest1.b)
网友评论