前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lua-浅拷贝与深拷贝(转)

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

作者头像
祝你万事顺利
发布2019-06-01 10:31:05
2.1K0
发布2019-06-01 10:31:05
举报
文章被收录于专栏:Unity游戏开发Unity游戏开发
浅拷贝

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

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

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

-- 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中所有元素以及设置元表即可!如下:

-- 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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 浅拷贝
  • 深拷贝
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档