Lua:完美克隆函数,为什么不呢?
2015-7-8 4:43:20
收藏:0
阅读:100
评论:1
这是一个我一直想知道为什么不可能的问题。为什么不能制作一个完美的克隆函数?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/3931841 和 https://gist.github.com/tylerneylon/81333721109155b2d244
能否有人解释一下为什么不能制作一个完美的克隆或复制函数?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
关于深复制与浅复制的讨论
补充一下 @lhf 的 完美 答案。我认为这个问题已经在 Lua 邮件列表上被讨论了多次,我认为有两个原因:(1) 对于一个问题来说,完美且合理的方式,在另一个问题上可能会过度;(2) 由于元方法、上值和循环引用等问题,很难完美地覆盖各种情况。例如,假设你提供一个使用元方法的代理表。现在,在克隆两个表之后,它们共享相同的代理表,其中一个表存储的任何对象都将被另一个表看到。这是一个“完美”的克隆吗?
在更哲学性但仍然相关的讨论中,由于对象存在外部关联(克隆_可能_需要保留这些关联,也可能不需要),完美很难实现。你拥有一栋房子,你的完美克隆也拥有同样的房子吗?你们每个人现在都拥有该房子的 50% 吗?如果再克隆一次呢?或者你很幸福地结了婚,你的克隆呢?你的配偶也需要克隆吗?在这种情况下,完美和不完美之间的界限在哪里?
如果你关心深复制和浅复制之间的区别,那么你可能可以自己编写一个函数。