lua 深拷贝与浅拷贝

浅拷贝修改拷贝的某个键对应的值并不影响原始的表的键对应值(只能作用于第一层,如果多层嵌套就会导致原始表被修改)

这个深拷贝可以同时复制原始表的元表。如果不许要可以将setmetatable(copy, deep_copy(getmetatable(orig)))去掉。

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

猜你喜欢

转载自blog.csdn.net/Momo_Da/article/details/102785525