table类型是引用,直接赋值的话不同变量指向的还是同一个对象,因此需要对table进行深拷贝
--string、number、boolean这些基本类型,会进行复制,会创建一个新对象,拷贝出来的对象和原来的互不影响
local num1 = 5
local num2 = num1
num1 = 10
print(num1) --=> 10
print(num2) --=> 5
--table是引用,拷贝出来的对象和原对象是同一个对象
table1 = {1,2,3,4}
table2 = table1
table1[5] = 5
for k,v in pairs(table2) do --=> 1,2,3,4,5
print(k,v)
end
--因此对table的拷贝需要使用深拷贝。
function clone(object)
--记录拷贝过的表,防止循环引用,导致无限递归
local lookup_table = {}
local function _copy(object)
--如果不是table类型,直接返回值(基本类型)
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
--递归拷贝每个键值对,对每个键值调用_copy方法拷贝
--因为键值也有可能是一个表
for k,v in pairs(object) do
new_table[_copy(k)] = _copy(v)
end
--为拷贝表设置与原来的表相同的元表
return setmetatable(new_table,getmetatable(object))
end
return _copy(object)
end
print("深拷贝")
table3 = {1,{114514,nil,2},["str"] = "哈哈哈",4}
table4 = clone(table3)
table3[5] = 5
for k,v in pairs(table4) do --=> 1,114514,2,4,哈哈哈
if(type(v) ~= "table") then
print(v)
else
for _k,_v in pairs(v) do
print(_v)
end
end
end
评论(0)
暂无评论