在lua中,如果是嵌套的table的话,直接 table1 = table2 的话,当修改table2 时 table1是会受到影响的,因为直接赋值是浅拷贝,只是取了地址;所以对于深层次的嵌套table,当我们需要复制的时候我们需要对其进行深拷贝。
这里说的深拷贝,主要就是把嵌套table的每一个key,value都重新创建一份。因为在lua中对于普通值是重新申请了一个空间,属于深拷贝。对于非table类型的数据,无需拷贝直接返回自身,否则递归遍历拷贝table中的所有元素
注意需要用元表来“拷贝”目标的元表的数据。
-- Lua table deep copy
function clone(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then --非table直接返回
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) --递归遍历table的元素
end
return setmetatable(new_table, getmetatable(object)) --拷贝目标的元表的数据
end
return _copy(object)
end