【原】lua的table深拷贝
2015-06-15 11:01
573 查看
一般写的时候要注意以下几个问题:
1.自己里面的属性是自己,要防止死循环
2.同一个table地址出现在table属性(k或者v)的不同地方,复制时不能复制成2个table地址,需与原来地址保持一致
3.元表属性需要继承
但是这样还是有2个问题。
1.当表比较深时,递推层次很深时会不会出现栈溢出
2.userdata类型的数据在这里没有做深拷贝,还是引用了原来的值
后续可以跟进下这个问题
1.自己里面的属性是自己,要防止死循环
2.同一个table地址出现在table属性(k或者v)的不同地方,复制时不能复制成2个table地址,需与原来地址保持一致
3.元表属性需要继承
function table.copy(object) -- 已经复制过的table,key为复制源table,value为复制后的table -- 为了防止table中的某个属性为自身时出现死循环 -- 避免本该是同一个table的属性,在复制时变成2个不同的table(内容同,但是地址关系和原来的不一样了) local lookup_table = {} local function _copy(object) if type(object) ~= 'table' then -- 非table类型都直接返回 return object elseif lookup_table[object] then return lookup_table[object] end local new_table = {} lookup_table[object] = new_table for k,v in pairs(object) do new_table[_copy(k)] = _copy(v) end -- 这里直接拿mt来用是因为一般对table操作不会很粗暴的修改mt的相关内容 return setmetatable(new_table, getmetatable(object)) end return _copy(object) end
但是这样还是有2个问题。
1.当表比较深时,递推层次很深时会不会出现栈溢出
2.userdata类型的数据在这里没有做深拷贝,还是引用了原来的值
后续可以跟进下这个问题
相关文章推荐
- lua string 库
- Lua 学习笔记三 Mac安装Lua
- Evaluate Reverse Polish Notation
- Lua脚本认知小结
- Incompatibilities with Lua 5.2
- Lua获取系统时间和时间格式化方法
- Lua中的模块与module函数
- lua--函数深入:闭合函数,局部函数,尾调用
- Lua中的字符串操作
- Lua学习 2) —— Android与Lua互调
- lua学习笔记(2)——内核入口
- lua 弱表
- lua学习笔记(1)——编译配置
- [leetcode] Evaluate Reverse Polish Notation
- Lua字符串及字符串匹配
- fflua更新-增加对引用的支持
- tolua reference
- luajit利用ffi结合C语言实现面向对象的封装库
- lua--函数.变长参数 and 具名实参
- lua--函数之多重返回值