这是一个我一直想知道为什么不可能的问题。为什么不能制作完美的克隆功能?不是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/3931841和https://gist.github.com/tylerneylon/81333721109155b2d244
有人可以解释为什么不能制作完美的克隆或复制功能吗?
答案 0 :(得分:6)
扩展@ lhf的完美备注。我认为这已经多次在Lua maillist上进行了讨论,我认为有两个原因:(1)对于一个案例来说,完美和合理的是另一个案例是否过度; (2)由于元方法,upvalues和循环引用,很难涵盖完美的各种情况。例如,假设您使用metamethods提供代理表。现在,在克隆之后,两个表共享相同的代理表,而另一个表可以看到存储的一个表。这是否是一个“完美”克隆?
更具哲学性,但仍然相关的说明。由于对象具有外部链接(而且 你拥有一所房子。你完美的克隆是否以同样的方式拥有同一栋房子?你们每个人现在拥有房子的50%吗?第三个克隆怎么样?或者你幸福地结婚了。你的克隆怎么样?配偶是否也需要克隆?在这种情况下,完美与不完美之间的界限在哪里?
当你关心深拷贝和浅拷贝之间的区别时,你可以编写自己的函数。