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  

LUA表克隆方法归纳的更多相关文章

  1. Lua __index元方法

    [Lua __index元方法] 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键.如果__ ...

  2. Lua中“.”调用方法与“:”调用方法的区别

    Lua中“.”调用方法与“:”调用方法的区别:                                                                             ...

  3. 编写高效Lua代码的方法

    编写高效Lua代码的方法 翻译自<Lua Programming Gems>Chapter 2:Lua Performance Tips:Basic fact By Roberto Ier ...

  4. Lua表(table)的用法_个人总结

    Lua表(table)的用法_个人总结 1.表的创建及表的介绍 --table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意 ...

  5. MySQL锁表解决方法

    https://blog.csdn.net/a5582ddff/article/details/79566678 MySQL锁表解决方法 一.我的处理过程 1.查进程,主要是查找被锁表的那个进程的ID ...

  6. 用vs2013编译lua源码方法(一)

    用vs2013编译lua源码方法 来源:网络    编辑:admin 1.下载lua源码:lua-5.2.3.tar.gz,解压 2.用vs2013建立一个win32工程: 1)下载后解压到一个目录下 ...

  7. Dynamic CRM 2013学习笔记(二十七)无代码 复制/克隆方法

    前面介绍过二种复制/克隆方法:<Dynamic CRM 2013学习笔记(十四)复制/克隆记录> 和<Dynamic CRM 2013学习笔记(二十五)JS调用web service ...

  8. 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法

    几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...

  9. oracle 表迁移方法 (二) 约束不失效

    DB:11.2.0.3.0 在oracle 表迁移方法 (一)中,只是move了一张普通的表,如果表的字段带有主键约束呢 ? [oracle@db01 ~]$ sqlplus / as sysdba ...

随机推荐

  1. div基础

    1. 写在后面的样式优于前面,会把前面的覆盖掉! 2.三角形的造法:width:0; height:0;然后设置border-left   border-right  border-top  bord ...

  2. Jquery_AjaxFileUpload插件的使用记录

    功能需求:Spring MVC框架下,实现无刷新页面上传图片,并展示图片预览效果 直接上代码: 1.图片预览效果 <%@ page contentType="text/html;cha ...

  3. Springmvc+Hibernate在Eclipse启动Tomcat需要很长时间的解决方法

    最近在学习SpringMvc开发,有一个提问困扰了很久,就是在Eclipse启动Tomcat需要很长时间,大概要1分多钟. 启动日志: 九月 08, 2016 8:59:01 下午 org.apach ...

  4. c# Dictionary的遍历和排序(转)

    c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 foreach: 需要实现ienume ...

  5. ASP.NET中Web DataGrid的使用指南

    DataGrid/DataList在ASP.NET非常重要,凡显示Table类型的数据,大多会使用这两个控件. 一.方法 1.DataBind很简单.最常用的方法.绑定数据用.需要注意的只有一点:执行 ...

  6. jquery .post .get中文参数乱码解决方法详解

    jquery默认的编码为utf-8,做项目时有时处于项目需要用到ajax提交中文参数,乱码问题就很头疼了,折腾了许久终于弄出来了.为了便于传输,我们首先将需要用到的参数用javascript自带的函数 ...

  7. 配置Nginx支持ThinkPHP的URL重写和PATHINFO

    ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,只需要在配置文件中设置 'URL_MODEL' => 2 即可.在Apache下只需要开启mod_rew ...

  8. Log打印日志遇到的问题

    Log日志打印出现空指针问题 AndroidRuntime(372): Caused by: java.lang.NullPointerException: println needs a messa ...

  9. [LintCode] Segment Tree Build 建立线段树

    The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...

  10. Hibernate中易错地方的总结

    1.Hibernate中的配置文件要放在src下,注意不能放在包目录下 2.Hibernate中@Before   @After方法不能再普通的类里用,只有在专门的JUnit测试用例里面用. 3.使用 ...