Lua - 深拷贝deepcopy的实现

深拷贝是为了对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
=====================我是分界线==============================

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值