当表中不含有其他表时
这是可以直接使用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
拷贝完成后,需要设置两个表具有相同的元表,以让两个对象完全一样。