Lua Table 引用, 拷贝

    lua 除了简单类型分配内存外,table只是传递引用,所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。

1tb = {} 2tb.a = 11 3tb.b = 22 4tb_ref = tb 5function p(tip) 6  print("--------------------------"  .. tip) 7  print("tb.a = " .. tb.a .. "    " .. "tb.b = " .. tb.b) 8  print("tb_ref.a = " .. tb_ref.a .. "    " .. "tb_ref.b" .. tb_ref.b) 9end 10p("原始") 11tb_ref.a = 33 12p("修改了引用的a = 33,原来的a也变了") 13tb.b = 44 14p("修改了原始的b = 44,引用的b也变了") 15print("----------------------非表test") 16= 1 17= a 18= 3 19print("a = " .. a) 20print("c = " .. c)  21 22打印结果: 23--------------------------原始 24tb.a = 11    tb.b = 22 25tb_ref.a = 11    tb_ref.b22 26--------------------------修改了引用的a = 33,原来的a也变了 27tb.a = 33    tb.b = 22 28tb_ref.a = 33    tb_ref.b22 29--------------------------修改了原始的b = 44,引用的b也变了 30tb.a = 33    tb.b = 44 31tb_ref.a = 33    tb_ref.b44 32----------------------非表test 33= 1 34= 3

1,当改变表的一个值以后,它的引用的值也发生了变化。

2,对于非表的一般常数来说,它的赋值不存在引用的问题。

LuaTable的拷贝方法:

方法一:

1function th_table_dup(ori_tab) 2    if (type(ori_tab) ~= "table") then 3        return nil; 4    end 5    local new_tab = {}; 6    for i,in pairs(ori_tab) do 7        local vtyp = type(v); 8        if (vtyp == "table") then 9            new_tab[i] = th_table_dup(v); 10        elseif (vtyp == "thread") then 11            -- TODO: dup or just point to? 12            new_tab[i] = v; 13        elseif (vtyp == "userdata") then 14            -- TODO: dup or just point to? 15            new_tab[i] = v; 16        else 17            new_tab[i] = v; 18        end 19    end 20    return new_tab; 21end

方法二:

1function deepcopy(object) 2    local lookup_table = {} 3    local function _copy(object) 4        if type(object) ~= "table" then 5            return object 6        elseif lookup_table[object] then 7            return lookup_table[object] 8        end  -- if 9        local new_table = {} 10        lookup_table[object] = new_table 11        for index, value in pairs(object) do 12            new_table[_copy(index)] = _copy(value) 13        end  -- for 14        return setmetatable(new_table, getmetatable(object)) 15    end  -- function _copy 16    return _copy(object) 17end  -- function deepcopy

参考网址:

http://blog.sina.com.cn/s/blog_49bdd36d0100fdc1.html

http://www.360doc.com/content/13/1112/21/14605176_328731142.shtml

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )