阅读 19

lua深度拷贝表

当表中不含有其他表时

这是可以直接使用table.move(a1,f,e,t,a2)将一个表的内容拷贝到另一个表中,例如:

local t = {3,4,5,6}
local t2 = {}
table.move(t,1,4,1,t2)
setmetatable(t2,getmetatable(t1))
t2[2] = 44
for k,v in ipairs(t) do
    print(k,v)
end
print('-----------')
for k,v in ipairs(t2) do
    print(k,v)
end
-- 1	3
-- 2	4
-- 3	5
-- 4	6
-- -----------
-- 1	3
-- 2	44
-- 3	5
-- 4	6
复制代码
  • a1为要被复制的表
  • f为开始复制的位置
  • e为终止位置
  • t移动到目标表的起始的位置
  • a2存储复制值的表
  • 将两个对象的元表设置为相同的元表,以让两个对象完全相同

当表中含有其他表时

若表中含有其他的表a1时,拷贝的是指向a1的引用,通过拷贝的引用操控的还是表a1,所以需要进行一些递归处理,如下:

local tab = {{4},5,6,7}
local ta = {}

function clone(obj)
    if type(obj) ~= "table" then
        return obj
    end
    local newtable = {}

    for key,value in pairs(obj) do
        newtable[key] = clone(value)
    end
    setmetatable(newtable,getmetatable(obj))
    return newtable
end

ta = clone(tab)
ta[1][1] = 2
ta[2] = 44
print(ta[1][1],tab[1][1])

print(ta[2],tab[2])
-- 2   4
-- 44  5
复制代码

拷贝完成后,需要设置两个表具有相同的元表,以让两个对象完全一样。