zoukankan      html  css  js  c++  java
  • lua踩坑系列之浅拷贝与深拷贝

    推荐阅读:

    前言

    先来说说·,为什么突然谈及到浅拷贝和深拷贝这个问题。因为时间紧任务重,lua零基础参与项目研发,没有系统学过lua,对于lua里面的坑,差不多该踩的,能踩的,我踩了,或者即将去踩了。这不,本来周五准时下班,然后愉快的度过一个双休。梦想总是美好的,现实就是,它来了(坑),由于系统模块比较大,牵扯到的数据比较多,开发的时候也没太注重数据的统一,数据出现了,只能大海捞针去找问题。

    浅拷贝和深拷贝

    对于拷贝这个问题,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["csdn"]="懒人下蛋"
    tab["抖音"]="shirln"
    tab["微信公众号"]="懒人下蛋"
    tab["QQ群"]="704621321"
    
    for k,v in pairs(tab) do
    	print(k.."对应的账号:"..v)
    end
    
    local temp=tab
    temp["csdn"]="爱上游戏开发"
    temp["微信公众号"]="爱上游戏开发"
    
    for k,v in pairs(tab) do
    	print("拷贝前的对象:"..k.."对应的账号:"..v)
    end
    for k,v in pairs(temp) do
    	print("拷贝后的对象:"..k.."对应的账号:"..v)
    end
    

    输出结果:

    csdn对应的账号:懒人下蛋
    QQ群对应的账号:704621321
    微信公众号对应的账号:懒人下蛋
    抖音对应的账号:shirln
    
    拷贝前的对象:csdn对应的账号:爱上游戏开发
    拷贝前的对象:QQ群对应的账号:704621321
    拷贝前的对象:微信公众号对应的账号:爱上游戏开发
    拷贝前的对象:抖音对应的账号:shirln
    
    拷贝后的对象:csdn对应的账号:爱上游戏开发
    拷贝后的对象:QQ群对应的账号:704621321
    拷贝后的对象:微信公众号对应的账号:爱上游戏开发
    拷贝后的对象:抖音对应的账号:shirln
    

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

    深拷贝

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

    function clone(master)
        local temp = {}
        for k, v in pairs(master) do
            if type(v) == "table" then
                temp[k] = clone(v)
            else
                temp[k] = v
            end
        end
        return temp
    end
    

    使用方法:

    local tab={}
    tab["csdn"]="爱上游戏开发"
    tab["抖音"]="shirln"
    tab["微信公众号"]="爱上游戏开发"
    tab["QQ群"]="704621321"
    
    local temp=clone(tab)
    prring(temp)
    

    输出结果

    704621321
    shirln
    爱上游戏开发
    爱上游戏开发
    
  • 相关阅读:
    hdu 1272
    BZOJ_3685_普通van Emde Boas树_权值线段树
    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
    BZOJ_3252_攻略_线段树+dfs序
    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
    BZOJ_3210_花神的浇花集会_切比雪夫距离
    BZOJ_2124_等差子序列_线段树+Hash
    BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
    BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心
    BZOJ_4325_NOIP2015 斗地主_DFS
  • 原文地址:https://www.cnblogs.com/shirln/p/13389663.html
Copyright © 2011-2022 走看看