Lua:完美克隆函数,为什么不呢?

这是一个我一直想知道为什么不可能的问题。为什么不能制作一个完美的克隆函数?Lua 5.3中不包括一个table.copy函数吗?我想这个函数应该可以处理所有的问题和情况。

通过各种克隆函数,我指的是像这样的函数(深克隆,浅克隆,递归等)...

function deep (t) --深度复制表
    if type(t) ~= "table" then return t end
    local meta = getmetatable(t)
    local target = {}
    for k, v in pairs(t) do
        if type(v) == "table" then
            target[k] = clone(v)
        else
            target[k] = v
        end
    end
    setmetatable(target, meta)
    return target
end

function shallow (t) --浅复制表
    if type(t) ~= "table" then return t end
    local meta = getmetatable(t)
    local target = {}
    for k, v in pairs(t) do target[k] = v end
    setmetatable(target, meta)
    return target
end

function copy1(obj)
  if type(obj) ~= 'table' then return obj end
  local res = {}
  for k, v in pairs(obj) do res[copy1(k)] = copy1(v) end
  return res
end

function copy2(obj)
  if type(obj) ~= 'table' then return obj end
  local res = setmetatable({}, getmetatable(obj))
  for k, v in pairs(obj) do res[copy2(k)] = copy2(v) end
  return res
end

function copy3(obj, seen)
  if type(obj) ~= 'table' then return obj end
  if seen and seen[obj] then return seen[obj] end
  local s = seen or {}
  local res = setmetatable({}, getmetatable(obj))
  s[obj] = res
  for k, v in pairs(obj) do res[copy3(k, s)] = copy3(v, s) end
  return res
end

来源:https://gist.github.com/MihailJP/3931841https://gist.github.com/tylerneylon/81333721109155b2d244

能否有人解释一下为什么不能制作一个完美的克隆或复制函数?

点赞
用户1442917
用户1442917

关于深复制与浅复制的讨论

补充一下 @lhf 的 完美 答案。我认为这个问题已经在 Lua 邮件列表上被讨论了多次,我认为有两个原因:(1) 对于一个问题来说,完美且合理的方式,在另一个问题上可能会过度;(2) 由于元方法、上值和循环引用等问题,很难完美地覆盖各种情况。例如,假设你提供一个使用元方法的代理表。现在,在克隆两个表之后,它们共享相同的代理表,其中一个表存储的任何对象都将被另一个表看到。这是一个“完美”的克隆吗?

在更哲学性但仍然相关的讨论中,由于对象存在外部关联(克隆_可能_需要保留这些关联,也可能不需要),完美很难实现。你拥有一栋房子,你的完美克隆也拥有同样的房子吗?你们每个人现在都拥有该房子的 50% 吗?如果再克隆一次呢?或者你很幸福地结了婚,你的克隆呢?你的配偶也需要克隆吗?在这种情况下,完美和不完美之间的界限在哪里?

如果你关心深复制和浅复制之间的区别,那么你可能可以自己编写一个函数。

2014-11-26 02:32:04