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

Lua的深拷贝和浅拷贝

作者头像
南锋
发布2022-12-26 14:29:03
3130
发布2022-12-26 14:29:03
举报
文章被收录于专栏:淡忘的博客

今天在写游戏的时候,遇到了一个数据问题,就开始查资料

代码如下

代码语言:javascript
复制
--- Deep copies a table into a new table.
-- Tables used as keys are also deep copied, as are metatables
-- @param orig The table to copy
-- @return Returns a copy of the input table
local function deep_copy(orig)
  local copy
  if type(orig) == "table" then
    copy = {}
    for orig_key, orig_value in next, orig, nil do
      copy[deep_copy(orig_key)] = deep_copy(orig_value)
    end
    setmetatable(copy, deep_copy(getmetatable(orig)))
  else
    copy = orig
  end
  return copy
end

--- Copies a table into a new table.
-- neither sub tables nor metatables will be copied.
-- @param orig The table to copy
-- @return Returns a copy of the input table
local function shallow_copy(orig)
  local copy
  if type(orig) == "table" then
    copy = {}
    for orig_key, orig_value in pairs(orig) do
      copy[orig_key] = orig_value
    end
  else -- number, string, boolean, etc
    copy = orig
  end
  return copy
end

例子如下:

深拷贝

代码语言:javascript
复制
local a = { aa = 1, bb = 2, cc = { dd = { ee = 3 } } }
--local b = deep_copy(a)
local b = shallow_copy(a)
b.cc.dd.ee = 111
b.bb = 111
ngx.say(cjson.encode(a))
ngx.say(cjson.encode(b))

结果:{“aa”:1,”bb”:2,”cc”:{“dd”:{“ee”:111}}}

{“aa”:1,”bb”:111,”cc”:{“dd”:{“ee”:111}}}

浅拷贝

代码语言:javascript
复制
local men = { mkey = 555 }
local a = { aa = 1, bb = 2, cc = { dd = { ee = { ff = 3 } } } }
setmetatable(a, { __index = men })
local b = deep_copy(a)

ngx.say(a.cc.dd.ee.ff)
ngx.say(a.mkey)
ngx.say(b.mkey)

3

555

555

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

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

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

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

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