标签:
将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
标签:
原文地址:http://www.cnblogs.com/lightsong/p/4987024.html