Lua中的浅拷贝和深拷贝

浅拷贝

在 Lua 中,使用赋值运算符 "=" 进行浅拷贝的时候,分两种情况:

1、拷贝对象的类型是 string、number、boolean 这些基本类型的时候,会进行复制,创建一个新的对象,拷贝出来的对象和原来的对象互不影响,所以修改拷贝出来的对象的值不会影响到原来的对象的值!

2、拷贝对象的类型是 table 的时候,则是直接进行引用,拷贝出来的对象和原来的对象实际上是同一个对象,所以修改拷贝出来的对象中的元素的值也会使原来的对象中元素的值发生改变!

-- number
local numTest1 = 5
local numTest2 = numTest1  -- string、number、boolean这些基本类型使用"="会进行复制
numTest2 = 10  -- 修改numTest2的值,numTest1的值不会被修改
print(numTest1)
-- 5

-- string
local strTest1 = "hello world!"
local strTest2 = strTest1
strTest2 = "hello China!"
print(strTest1)
-- hello world!

-- table
local tblTest1 = {a = 1, b = 2, c = 3}
local tblTest2 = tblTest1  -- table使用"="进行的是引用
tblTest2.b = 99  -- 修改tblTest2中元素的值,tblTest1中对应元素的值也会被修改
print(tblTest1.b)
-- 99

深拷贝

那么问题来了:如果我现在想要 table 也实现深拷贝该如何操作呢?

Lua 中是没有提供这样的 API 的,那就自己封装一个函数,递归拷贝 table 中所有元素以及设置元表即可!如下:

-- Lua table deep copy
function clone(object)
    local lookup_table = {}
    local function _copy(object)
        if type(object) ~= "table" then
            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)
        end
        return setmetatable(new_table, getmetatable(object))
    end
    return _copy(object)
end

-- test
local deepCopyTest1 = {a = 1, b = 2, c = 3}
local deepCopyTest2 = clone(deepCopyTest1)
deepCopyTest2.b = 99
print(deepCopyTest1.b)
-- 2
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fightsyj

您的鼓励将是我分享的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值