-- (深层)拷贝表, 与clone不一样, 目前clone是浅层
-- 如果是array, 对原表可以追加,也可以覆盖
-- 支持循环表
-- TODO:暂不支持拷贝metatable
-- @param table t 待拷贝的表
-- @param number n 为预估table大小, 默认为4
-- @param table res 指定结果表
-- @param boolean array 表示t是否为数组形式, 或者说只拷贝数组部分
-- @param boolean insert 当为数组形式, 是否要插入, 还是覆盖
-- @param table saved 内部参数, 用于循环表
-- @return table
local function copy(t, n, res, array, insert, saved)
if type(t) ~= "table" then
return t
end
-- Fix circle table
saved = saved or tab_new(0, 4)
if saved[t] then
return saved[t]
end
if not res then
n = n or 4
if array then
n = #t
res = tab_new(n, 0)
else
res = tab_new(0, n)
end
end
saved[t] = res
if array then
local len
local index = insert and #res or 0
for _, v in ipairs(t) do
index = index + 1
len = (type(v) == 'table') and #v or nil
-- res[index] = copy(v, len, nil, array, insert, saved)
-- 下一次的数据可能不是array, 所以就不传了
res[index] = copy(v, len, nil, nil, nil, saved)
end
else
for k, v in pairs(t) do
res[copy(k, nil, nil, nil, nil, saved)] = copy(v, nil, nil, nil, nil, saved)
end
end
return res
end
在 2018年9月14日星期五 UTC+8下午8:07:14,Appla写道:
github上 openresty/luajit2项目提到table.clone第二个参数传true时为深复制。
实际应用发现,依然是浅复制,是否真的支持深复制?
支持的话应该怎么使用呢?
麻烦解答下,谢谢。