LUA表克隆方法归纳

时间:2021-05-29 17:07:54

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