【原】lua的table深拷贝
一般写的时候要注意以下几个问题:
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深拷贝相关推荐
- Lua 的table遍历 【转】
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rangercyh.blog.51cto.com/1444712/1032925 ...
- Lua 之table的测试
一.lua 的 table构造 1.字符串作为table索引 法1. MyTable = {x = "xixi"} 法2. MyTable = {["x"] = ...
- Lua 中 table 库函数 table.concat 连接 函数
Lua 中 table 库函数 table.concat 连接 函数 do--> table.concat 连接 函数 tab = {"a", "c", ...
- lua之table的使用
本文对从数据结构,存储和使用三个角度对lua之table的使用进行小结. 数据结构: table是lua的一种数据结构,可以用来存放各种类型的元素,例如可以创建数组和字典,以及二者混合的数据结构, 例 ...
- 【游戏开发解答】Unity使用lua将table转为树结构,以多级折叠内容列表的UI形式展现(树结构 | UGUI | 折叠展开 | lua)
文章目录 一.前言 二.Unity lua环境 三.树节点 1.创建脚本:TreeNode.lua 2.封装节点 四.树逻辑 1.创建脚本:TreeLogic.lua 2.构造测试数据 3.构造树 4 ...
- lua中table.和table[]的区别
lua中table.和table[]的区别 lua中的table可以定义为如下格式 local tab = { ["one"] = 1, ["two"] = 2 ...
- lua使用table例子
table在Lua中唯一的数据结构,其它语言提供的各种数据结构Lua都是用table来实现的 .下面是一个C API操作table的例子. #include <stdio.h> #incl ...
- lua中table的常用方法
转载:https://blog.csdn.net/Fenglele_Fans/article/details/83627021 1:table.sort() language = {"lua ...
- lua的table库中的常用函数总结
table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下: (1).table 是一个"关联数组",数组的索引可以是数字或者是字符串; (2).tab ...
最新文章
- 普通用户下变成-bash-3.2$的解决方法
- 项目福利政策报名 | 项目启动资金、股权投资、住房购房补贴
- Programming Computer Vision with Python (学习笔记九)
- object的实例是 python_Python:type、object、class与内置类型实例
- 鸿蒙os 2.0跑分,预装鸿蒙OS 2.0!华为MatePad Pro2跑分曝光:麒麟9000、8GB内存
- vue.js中的v-model指令的深刻理解
- k8s部署jar包_使用Kubernetes部署Springboot或Nginx的详细教程
- 使用Byteman和JUnit进行故障注入
- java 获取手机归属地,引起net.UnknownHostException错误
- coreldraw水涟漪怎么做_都说女人是水做的,温柔如水,你怎么一点也不温柔呢?...
- JAVA原码反码补码
- SQL中的字符串函数
- 004 Leaflet 第四个demo 使用自己的图标替换marker图标
- 泛微 E9开发视频教程
- 【毕设】requests+bs4+re 爬取知网文献来源的信息
- 搭建ORB_SLAM3在Linux下的编译和运行环境
- 【web前端基础 | H5】HTML简介
- 安卓或苹果IOS的APP应用如何取名字?好的名字技巧?
- weblogic10 配置 domian
- 数据分析师有哪些证书?目前数据分析师都有哪些国际认证?
热门文章
- Windows7与Window2008 64位IIS7上面DCOM配置Excel、Word
- Letters比赛第六场1002 Babelfish解题报告
- 关于MOSS列表库新建列表项前的!New标识
- git commit撤销_Git commit 提交一堆记录?试试撤回 commit 操作,你会爱上它
- 严格模式explainFetchTask
- HDFS的读写限流方案
- 贵州农信凭证打印小程序_我的医保凭证小程序入口
- 集成springboot案例_SpringBoot开发者都在用的五款优质扩展,每个都很能打!
- Linux中sudo命令设置,Linux下sudo命令的配置与使用方法
- oracle主键id自动自增_Oracle主键ID设置自动增长(序列+触发器)