Lua:完美的克隆功能,为什么不呢?

时间:2014-11-26 00:24:25

标签: lua clone lua-table

这是一个我一直想知道为什么不可能的问题。为什么不能制作完美的克隆功能?不是Lua 5.3包含一个table.copy函数......我假设它处理所有问题/案例。

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

function deep (t) -- deep-copy a table
    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) -- shallow-copy a table
    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

有人可以解释为什么不能制作完美的克隆或复制功能吗?

1 个答案:

答案 0 :(得分:6)

扩展@ lhf的完美备注。我认为这已经多次在Lua maillist上进行了讨论,我认为有两个原因:(1)对于一个案例来说,完美和合理的是另一个案例是否过度; (2)由于元方法,upvalues和循环引用,很难涵盖完美的各种情况。例如,假设您使用metamethods提供代理表。现在,在克隆之后,两个表共享相同的代理表,而另一个表可以看到存储的一个表。这是否是一个“完美”克隆?

更具哲学性,但仍然相关的说明。由于对象具有外部链接(而且 你拥有一所房子。你完美的克隆是否以同样的方式拥有同一栋房子?你们每个人现在拥有房子的50%吗?第三个克隆怎么样?或者你幸福地结婚了。你的克隆怎么样?配偶是否也需要克隆?在这种情况下,完美与不完美之间的界限在哪里?

当你关心深拷贝和浅拷贝之间的区别时,你可以编写自己的函数。