gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:45:20 27 4
gpt4 key购买 nike

这是一个我一直想不通为什么不可能的问题。为什么做不出一个完美的克隆功能呢? 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

能否解释一下为什么无法实现完美的克隆或复制功能?

最佳答案

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

更具哲学性但仍然相关的说明。由于对象具有外部链接(并且克隆可能需要保留这些;或不需要),因此很难实现完美。你拥有一所房子。你的完美克隆人是否以同样的方式拥有同样的房子?你们每个人现在拥有房子的 50% 吗?第三个克隆呢?或者你们婚姻幸福。你的克隆人呢?配偶也需要克隆吗?在这种情况下,完美与不完美之间的界限在哪里?

等到你关心深拷贝和浅拷贝的区别时,你大概可以自己写函数了。

关于Lua:完美的克隆功能,为什么不呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27139298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com