Lua的浅拷贝和深拷贝

浅拷贝

在lua中,使用“=”进行浅拷贝,根据拷贝对象的不同,又分为两种情况:

1.拷贝对象为string、number、boolean等基础类型时,拷贝的过程是进行复制粘贴。创建一个新的对象,拷贝出来的新对象和原来的对象互不影响,互不干涉,所以修改拷贝出来的对象的值不会影响到原来的对象的值!

local value_A=10
local value_B=value_A
print("A的值:"..value_A)
print("B的值:"..value_B)
value_B=5
print("A的值:"..value_A)
print("B的值:"..value_B)

输出结果

A的值:10
B的值:10
A的值:10
B的值:5

2.拷贝对象的类型为table,拷贝出来的对象和拷贝前的实际上是同一个对象,占同一个内存,简单点说就是一个人的两个名字。如果改变了拷贝出来对象的值,原对象也会随之改变。

local tab={}
tab["aaa"]="自强"

for k,v in pairs(tab) do
	print(k.."对应的账号:"..v)
end

local temp=tab
temp["aaa"]="爱上游戏开发"

for k,v in pairs(tab) do
	print("拷贝前的对象:"..k.."对应的账号:"..v)
end
for k,v in pairs(temp) do
	print("拷贝后的对象:"..k.."对应的账号:"..v)
end

输出结果

aaa对应的账号:自强
拷贝前的对象:aaa对应的:爱上游戏开发
拷贝后的对象:aaa对应的:爱上游戏开发

深拷贝

如果想修改拷贝后的对象的值,使原对象不受影响,那么就要采用深拷贝了。

Lua中没有提供这样的api的,那就自己封装一个函数,递归拷贝table中所有元素,如果有元表则设置元表即可!

function TableDeepCopy(targetTab)
    if targetTab == nil then
        return nil
    end
    if type(targetTab) ~= "table" then
        return targetTab
    end
    local new_tab = {}
    local mt = getmetatable(targetTab)
    if mt ~= nil then
        setmetatable(new_tab, mt)
    end
    for i, v in pairs(targetTab) do
        if type(v) == "table" then
            new_tab[i] = TableDeepCopy(v)
        else
            new_tab[i] = v
        end
    end
    return new_tab
end

local tab = {}
tab.abc = 123
local ss = TableDeepCopy(tab)
ss.abc = 111
print(tab.abc)
print(ss.abc)

输出结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值