一般写的时候要注意以下几个问题:

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 objectelseif lookup_table[object] thenreturn lookup_table[object]end local new_table = {}lookup_table[object] = new_tablefor k,v in pairs(object) donew_table[_copy(k)] = _copy(v) end -- 这里直接拿mt来用是因为一般对table操作不会很粗暴的修改mt的相关内容return setmetatable(new_table, getmetatable(object))end return _copy(object)
end

但是这样还是有2个问题。

1.当表比较深时,递推层次很深时会不会出现栈溢出

2.userdata类型的数据在这里没有做深拷贝,还是引用了原来的值

后续可以跟进下这个问题

转载于:https://www.cnblogs.com/vanishfan/p/4576603.html

【原】lua的table深拷贝相关推荐

  1. Lua 的table遍历 【转】

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rangercyh.blog.51cto.com/1444712/1032925 ...

  2. Lua 之table的测试

    一.lua 的 table构造 1.字符串作为table索引 法1. MyTable = {x = "xixi"} 法2. MyTable = {["x"] = ...

  3. Lua 中 table 库函数 table.concat 连接 函数

    Lua 中 table 库函数 table.concat 连接 函数 do--> table.concat 连接 函数 tab = {"a", "c", ...

  4. lua之table的使用

    本文对从数据结构,存储和使用三个角度对lua之table的使用进行小结. 数据结构: table是lua的一种数据结构,可以用来存放各种类型的元素,例如可以创建数组和字典,以及二者混合的数据结构, 例 ...

  5. 【游戏开发解答】Unity使用lua将table转为树结构,以多级折叠内容列表的UI形式展现(树结构 | UGUI | 折叠展开 | lua)

    文章目录 一.前言 二.Unity lua环境 三.树节点 1.创建脚本:TreeNode.lua 2.封装节点 四.树逻辑 1.创建脚本:TreeLogic.lua 2.构造测试数据 3.构造树 4 ...

  6. lua中table.和table[]的区别

    lua中table.和table[]的区别 lua中的table可以定义为如下格式 local tab = { ["one"] = 1, ["two"] = 2 ...

  7. lua使用table例子

    table在Lua中唯一的数据结构,其它语言提供的各种数据结构Lua都是用table来实现的 .下面是一个C API操作table的例子. #include <stdio.h> #incl ...

  8. lua中table的常用方法

    转载:https://blog.csdn.net/Fenglele_Fans/article/details/83627021 1:table.sort() language = {"lua ...

  9. lua的table库中的常用函数总结

    table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下:  (1).table 是一个"关联数组",数组的索引可以是数字或者是字符串;  (2).tab ...

最新文章

  1. 普通用户下变成-bash-3.2$的解决方法
  2. 项目福利政策报名 | 项目启动资金、股权投资、住房购房补贴
  3. Programming Computer Vision with Python (学习笔记九)
  4. object的实例是 python_Python:type、object、class与内置类型实例
  5. 鸿蒙os 2.0跑分,预装鸿蒙OS 2.0!华为MatePad Pro2跑分曝光:麒麟9000、8GB内存
  6. vue.js中的v-model指令的深刻理解
  7. k8s部署jar包_使用Kubernetes部署Springboot或Nginx的详细教程
  8. 使用Byteman和JUnit进行故障注入
  9. java 获取手机归属地,引起net.UnknownHostException错误
  10. coreldraw水涟漪怎么做_都说女人是水做的,温柔如水,你怎么一点也不温柔呢?...
  11. JAVA原码反码补码
  12. SQL中的字符串函数
  13. 004 Leaflet 第四个demo 使用自己的图标替换marker图标
  14. 泛微 E9开发视频教程
  15. 【毕设】requests+bs4+re 爬取知网文献来源的信息
  16. 搭建ORB_SLAM3在Linux下的编译和运行环境
  17. 【web前端基础 | H5】HTML简介
  18. 安卓或苹果IOS的APP应用如何取名字?好的名字技巧?
  19. weblogic10 配置 domian
  20. 数据分析师有哪些证书?目前数据分析师都有哪些国际认证?

热门文章

  1. Windows7与Window2008 64位IIS7上面DCOM配置Excel、Word
  2. Letters比赛第六场1002 Babelfish解题报告
  3. 关于MOSS列表库新建列表项前的!New标识
  4. git commit撤销_Git commit 提交一堆记录?试试撤回 commit 操作,你会爱上它
  5. 严格模式explainFetchTask
  6. HDFS的读写限流方案
  7. 贵州农信凭证打印小程序_我的医保凭证小程序入口
  8. 集成springboot案例_SpringBoot开发者都在用的五款优质扩展,每个都很能打!
  9. Linux中sudo命令设置,Linux下sudo命令的配置与使用方法
  10. oracle主键id自动自增_Oracle主键ID设置自动增长(序列+触发器)