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. ACM: HDU 1028 Ignatius and the Princess III-DP

     HDU 1028 Ignatius and the Princess III Time Limit:1000MS     Memory Limit:32768KB     64bit IO Form ...

  2. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  3. Linux 获取设备树源文件(DTS)里描述的资源

    Linux 获取设备树源文件(DTS)里的资源 韩大卫@吉林师范大学 在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 plat ...

  4. HighchartsJS创建点状带标识的图表实例

    上一篇我发布的是关于 HighchartsJS创建环形带标识的图表实例, 从那篇文章就可以看出 HighchartsJS 确实是一款功能很强大的图表库.利用它,我们可以在项目中创建出我们所需要的图表来 ...

  5. 获取IP(windows和linux)

    #ifdef _WIN32 #include <winsock2.h> #include <Ws2tcpip.h> #pragma comment(lib,"ws2_ ...

  6. C# using的一些事

    一.using释放资源 using不可以释放所有的对象,原因如下: 1.using可以主动释放的对象都需要实现IDisable接口. 2.即使都实现了IDisable接口,也没有必要全部使用using ...

  7. CentOS7 网络管理相关命令

    contos7 网卡配置文件自动识别ifcfg开头的文件(包括目录) CentOS7网卡命名规则: CentOS 7 开始对于网卡的编号则有另一套规则, 网卡的界面代号现在与网卡的来源有关,基本上的网 ...

  8. SPFA导读及介绍(转载)

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  9. java web重定向与转发

    首先定义一下这两个词: 重定向是将用户从当前页面或servlet定向到另外一个jsp页面或者servlet 转发是将用户对当前jsp页面或者servlet对象的请求转发给另外一个jsp页面或者serv ...

  10. CCF认证(1)

    #include <iostream> #include <windows.h> using namespace std; typedef struct letter{ int ...