lua深度克隆的实现(lua基本数据类型传的是值,表类型传的是引用)

来源:互联网 发布:淘宝手机端首页怎么做 编辑:程序博客网 时间:2024/05/17 11:04
local function main()    require "src/boot/Bootstrap"    BootStrap:boot( )          local value = "old"    cclog("OLD:"..value)    f(value)    cclog("NEW:"..value)endfunction f(value)    value = "new"end

输出:

[LUA-print] OLD:old

[LUA-print] NEW:old

总结:基本类型lua是传值

<2>

local function main()    require "src/boot/Bootstrap"    BootStrap:boot( )      --test测试    t1 = {a = "abc", b = "def"}    dump(t1)    f(t1)    dump(t1)endfunction f(t)    t["a"] = nilend--[[[LUA-print] dump from: [string "src/main.lua"]:132: in function <[string "src/main.lua"]:127>[LUA-print] - "<var>" = {[LUA-print] -     "a" = "abc"[LUA-print] -     "b" = "def"[LUA-print] - }[LUA-print] dump from: [string "src/main.lua"]:134: in function <[string "src/main.lua"]:127>[LUA-print] - "<var>" = {[LUA-print] -     "b" = "def"[LUA-print] - }]]
可见,通过f函数修改了表t1

总结:可见lua传表为传的引用,修改一个,会影响另一个表。

<3>深度克隆的实现

function 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)        end        return setmetatable(new_table, getmetatable(object))    end    return _copy(object)end

当然了,lua中直接用local objCopy = clone(obj),这样就克隆出来个一样的对象了。

总结:不过lua自带clone方法,直接使用就行。











0 0