代码实现lua的浅拷贝并进行深究

浅拷贝是对基础类型的值进行复制,对表复杂类型直接引用(和被拷贝的对象指向同一一个内存地址)。

浅拷贝通过赋值操作符“=”来实现,或者通过代码实现:

对表内的number类型和table类型数据浅拷贝

function copy(o)
    if type(o)=="table" then
        local nt={}
        for i, v in pairs(o) do
            nt[i]=v
        end
        nt=o  
        return nt
    else
        return o
    end
end

测试:

function copy(o)
    if type(o)=="table" then
        local nt={}
        print(string.format("赋值前拷贝的表nt:%s",nt))
        for i, v in pairs(o) do
            nt[i]=v
            print(string.format("赋值中v:%s",v))
        end
        nt=o                    --让需要拷贝的表和被拷贝的表是同一内存地址
        print(string.format("赋值后拷贝的表nt:%s",nt))
        return nt
    else
        return o
    end

end

a={
    x=100,
    tb={y=10}
}
print(string.format("赋值前被拷贝的表:%s",a))
b=copy(a)
b.x=1
print("被拷贝表的值:"..a.x.."  拷贝的表的值:"..b.x)

结果:

在迭代器遍历后,需要使两个表的内存地址相同(代码中的nt=o)。不相同则只有表内的子表内存地址相同

测试:

function copy(o)
    if type(o)=="table" then
        local nt={}
        print(string.format("赋值前拷贝的表nt:%s",nt))
        for i, v in pairs(o) do
            nt[i]=v
            print(string.format("赋值中v:%s",v))
        end
        --nt=o                    --让需要拷贝的表和被拷贝的表是同一内存地址
        print(string.format("赋值后拷贝的表nt:%s",nt))
        return nt
    else
        return o
    end

end

a={
    x=100,
    tb={y=10}
}
print(string.format("赋值前被拷贝的表:%s",a))
b=copy(a)
b.x=1
b.tb.y=-5
print("被拷贝表内x的值:"..a.x.."  拷贝的表内x的值:"..b.x)
print("被拷贝表内子表的y值:"..a.tb.y.."  拷贝的表内子表的y值:"..b.tb.y)

结果:

总结

通过代码实现浅拷贝时。需要注意使拷贝的表与被拷贝的表指向同一内存地址,如果不是同一地址,不影响子表的浅拷贝(子表仍然是同一内存地址)。

笔者认为这个代码不够理想,认为代码里的“=”都应该替换成copy函数,可惜能力有限,于是借此抛转引玉,欢迎指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值