Lua-浅拷贝与深拷贝(转)

2019-06-01 10:31:05 浏览数 (1)

浅拷贝

在Lua中,使用赋值运算符"="进行浅拷贝的时候,分两种情况:

1、拷贝对象的类型是string、number、boolean这些基本类型的时候,会进行复制,创建一个新的对象,拷贝出来的对象和原来的对象互不影响,所以修改拷贝出来的对象的值不会影响到原来的对象的值!

2、拷贝对象的类型是table的时候,则是直接进行引用,拷贝出来的对象和原来的对象实际上是同一个对象,所以修改拷贝出来的对象中的元素的值也会使原来的对象中元素的值发生改变!

代码语言:javascript复制
-- number
local numTest1 = 5
local numTest2 = numTest1  -- string、number、boolean这些基本类型使用"="会进行复制
numTest2 = 10  -- 修改numTest2的值,numTest1的值不会被修改
print(numTest1)
-- 5
 
-- string
local strTest1 = "hello world!"
local strTest2 = strTest1
strTest2 = "hello China!"
print(strTest1)
-- hello world!
 
-- table
local tblTest1 = {a = 1, b = 2, c = 3}
local tblTest2 = tblTest1  -- table使用"="进行的是引用
tblTest2.b = 99  -- 修改tblTest2中元素的值,tblTest1中对应元素的值也会被修改
print(tblTest1.b)
-- 99
深拷贝

那么问题来了:如果我现在想要table也实现深拷贝该如何操作呢?

Lua中是没有提供这样的api的,那就自己封装一个函数,递归拷贝table中所有元素以及设置元表即可!如下:

代码语言:javascript复制
-- Lua table deep copy
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
-- test
local deepCopyTest1 = {a = 1, b = 2, c = 3}
local deepCopyTest2 = clone(deepCopyTest1)
deepCopyTest2.b = 99
print(deepCopyTest1.b)

原文:https://blog.csdn.net/fightsyj/article/details/85055342

0 人点赞