lua deep copy and shallow copy

Shallow copy modifying the value corresponding to a key of the copy does not affect the key corresponding value of the original table (only on the first level, if multiple levels of nesting will cause the original table to be modified)

This deep copy can copy the meta table of the original table at the same time. It can be setmetatable(copy, deep_copy(getmetatable(orig)))removed if not allowed .

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

 

Guess you like

Origin blog.csdn.net/Momo_Da/article/details/102785525