深拷贝是为了对table多层嵌套时,进行数据的安全访问而设计的,代码实现:
print("=====================我是分界线==============================")
-- 浅拷贝 数据的安全访问只作用于第一层
function table.copy(src)
if src == nil then
print("!!! try copy nil")
return nil
end
local dst = {}
for k,v in pairs(src) do
dst[k] = v
end
print("浅拷贝成功")
return dst
end
-- 记录已拷贝的表
local DEEP_COPY_REF_TABLE = {}
-- 深拷贝 嵌套进行拷贝,同时复制原始表的元表
local function deepcopy(orig, depth)
if depth == nil then
depth = ""
end
if DEEP_COPY_REF_TABLE[orig] ~= nil then
return DEEP_COPY_REF_TABLE[orig]
end
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
DEEP_COPY_REF_TABLE[orig] = copy
for orig_key, orig_value in next, orig, nil do
if orig_key == "class" then
copy[orig_key] = orig_value
else
-- 递归进行嵌套的拷贝
local copy_val = deepcopy(orig_value, depth.." ")
copy[deepcopy(orig_key)] = copy_val
end
end
-- 拷贝原始表的元表
setmetatable(copy, getmetatable(orig))
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function table.deepcopy( orig )
local ret = deepcopy(orig)
DEEP_COPY_REF_TABLE = {}
print("深拷贝成功")
return ret
end
local a = { aa = 1, bb = 2, cc = { dd = { ee = 3 } } }
local c = { aa = 1, bb = 2, cc = { dd = { ee = 3 } } }
local b = table.copy(a)
local d = table.deepcopy(c)
b.cc.dd.ee = 222
b.bb = 111
d.cc.dd.ee = 222
d.bb = 111
-- 浅拷贝只对第一层起作用
print(a.bb .. " " .. b.bb)
print(a.cc.dd.ee .. " " .. b.cc.dd.ee)
-- 深拷贝对所用层起作用
print(c.bb .. " " .. d.bb)
print(c.cc.dd.ee .. " " .. d.cc.dd.ee)
print("=====================我是分界线==============================")
运行如下:
=====================我是分界线==============================
浅拷贝成功
深拷贝成功
2 111
222 222
2 111
3 222
=====================我是分界线==============================