首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卢阿:完美的克隆功能,为什么不呢?

卢阿:完美的克隆功能,为什么不呢?
EN

Stack Overflow用户
提问于 2014-11-26 00:24:25
回答 1查看 1.4K关注 0票数 3

这是一个我一直想知道为什么不可能的问题。为什么不能建立一个完美的克隆功能呢?Lua5.3不包括一个table.copy function...which,我假设它可以处理所有的问题/案例。

关于各种克隆函数,我指的是这样的东西(浅的,深的,递归的,等等).

代码语言:javascript
复制
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

有人能解释为什么一个完美的克隆或复制功能不能被制造出来吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-26 02:32:04

来扩展@lhf的完美音符。我想这在Lua邮件列表上已经讨论过好几次了,我想这有两个原因:(1)对于一个案例来说,完美和合理的东西对于另一个案例来说是过分的;(2)由于元方法、向上值和循环引用,很难完美地涵盖各种情况。例如,假设您使用元方法提供代理表。现在,在克隆两个表之后,两个表共享同一个代理表,其中一个表存储的内容被另一个表看到。这是一个“完美”的克隆人吗?

更有哲理,但仍然相关。由于对象所具有的外部链接(克隆人可能需要保存这些链接;或者不需要),很难实现完美。你拥有一所房子。你的完美克隆人是否以同样的方式拥有同样的房子?你们每个人现在都拥有50%的房子吗?第三个克隆人怎么样?否则你就幸福地结婚了。你的克隆人呢?配偶也需要克隆吗?在这种情况下,完美和不完美之间的界限在哪里?

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27139298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档