在Ruby中深度复制对象的最有效方法是什么?
|
我知道序列化对象(据我所知)是有效深度复制对象的唯一方法(只要它没有像“ 0”之类的有状态的东西),但是一种方法比另一种方法特别有效?
例如,由于我使用的是Rails,所以我总是可以使用
ActiveSupport::JSON
,to_xml
-从我可以看出,将对象编组是执行此操作的最常用方法之一。我希望封送处理可能是其中最有效的一种,因为它是Ruby内部的,但是我有什么遗漏吗?
编辑:请注意,它的实现是我已经讲过的-我不想替换现有的浅表复制方法(例如dup
和clone
),所以我最终可能会添加Object::deep_copy
,无论结果如何以上方法(或您的任何建议:)中开销最小的方法。
没有找到相关结果
已邀请:
3 个回复
肉簧咸缮
结果是:
翁茄口霉氖
输出量
我敢肯定,只要稍加修改,您就可以使这种冷却器变得更好,但无论好坏,这可能都是我会做的。
樊熄忙暖
如果要重新定义Ruby的
方法的行为,可以将其命名为
而不是
(在3个地方),但是我不知道重新定义Ruby \的克隆行为将如何影响Ruby库或Ruby在Rails上,所以请告诫Empor。就个人而言,我不建议您这样做。 例如:
如果要让您的类正确地进行深层克隆,则其
方法(初始化)必须能够以标准方式对该类的对象进行深层克隆,即,如果给出了第一个参数,则将其假定为要复制的对象。深克隆。 例如,假设我们想要一个M类。第一个参数必须是类M的可选对象。这里有第二个可选参数
,用于在新对象中预设z的值。
此处在克隆过程中会忽略
预设,但是您的方法可能会有不同的行为。将创建此类的对象,如下所示:
其中M类的对象是数组的一部分:
笔记: 如果
尝试克隆不以标准方式克隆自身的对象,则可能会失败。 如果ѭ13尝试克隆可以以标准方式克隆自己的对象,并且它是一个复杂的结构,则它可能(并且可能会)对其自身进行浅表克隆。
不会深度复制哈希中的密钥。原因是它们通常不被视为数据,但是如果将
更改为
,它们也将被深复制。 某些元素值没有
方法,例如Fixnum。这些对象始终具有相同的对象ID,并且会被复制而不是克隆。 请注意,因为在进行深层复制时,原始对象中包含相同对象的哈希或数组的两个部分在深层克隆中将包含不同的对象。