• LUA表克隆方法归纳


    lua表克隆

    将lua一个表, 克隆出一份为一个独立的另外一个表。

    对于一个module, 如果在require之后,获得的表对象, 不能直接修改, 例如lua缓存此表, 但是多次逻辑执行, 都使用的是原始module,

    这种情况就需要使用clone。

    clone实例, 例如将 {1} 克隆出一份 {1},

    使用 tostring 打印两个表,可以看到地址不同。

    支持浅、深拷贝方法

    深拷贝, 即当遇到表的key或者value也是表的时候, 将表也拷贝一份, 否则不拷贝, 否则的方法为浅拷贝。

    对于一般数据类型 , 例如  字符串 和  数字 和 布尔值, 都是深拷贝, 拷贝后独立一份。

    LUACI给的方法

    ---------------------
    
    --- Clones the given object and return it's copy.
    
    -- @param object Table value to clone
    
    -- @param deep Boolean indicating whether to do recursive cloning
    
    -- @return Cloned table value
    
    
    function clone(object, deep)
    
        local copy = {}
    
    
        for k, v in pairs(object) do
    
            if deep and type(v) == "table" then
    
                v = clone(v, deep)
    
            end
    
            copy[k] = v
    
        end
    
    
        return setmetatable(copy, getmetatable(object))
    
    end

    支持共享链接的深拷贝方法

    一个表的key和value, 是多个的, 如果这些链接, 引用的表, 存在共享行为, 使用上一个方法, 则会拷贝出两份不同地址的表, 表的内容一致。

    这个是不希望的。

    例如 a = {1}, b={["aa"]=a, ["bb"]=a}

    一个开源软件平台给出类解法

    -[[
    
    Function: cocos2dx_clone
    
    Description: lua表克隆接口,cocos2dx项目开源提供。拷贝策略:深拷贝。
    
                网络解释见 :
    
                http://blog.csdn.net/u013174689/article/details/41959011
    
    Parm: object(object): 待拷贝的lua对象。
    
    return: 拷贝过的lua对象。
    
    ]]
    
    function cocos2dx_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)
    
                print(key,value)--这句添加print函数 演示输出复制的过程
    
            end
    
            return setmetatable(new_table, getmetatable(object))
    
        end
    
        return _copy(object)--返回clone出来的object表指针/地址
    
    end  
  • 相关阅读:
    ffplay(2.0.1)中的音视频同步
    (转)ffplay的音视频同步分析之视频同步到音频
    (转) 从ffmpeg中提取出YUV数据
    关于解决用tutorial7教程中的代码打造一款自己的播放器中的声音噪音问题
    基于<最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)>的一些个人总结
    (转)SDL2.0在mfc窗口中显示yuv的一种方法
    (转)SDL1.2到2.0的迁移指南
    APM (应用性能管理)
    在telnet下操作memcache详解(操作命令详解)
    MYSQL主从数据库搭建
  • 原文地址:https://www.cnblogs.com/lightsong/p/4987024.html
Copyright © 2020-2023  润新知