我正在研究一些在 Ruby 中深度复制对象的技术(MRI 1.9.3)。
我遇到了以下示例,但我不确定#dup
方法实施。
我测试了它并且它确实有效,但是我不理解该方法的逻辑步骤,因此我不舒服在我自己的代码中使用它。
是声明@name = @name.dup
参考 iVarinside副本?如何?我看不到它。
有人可以解释一下吗?
另外,还有更好的方法吗?
class MyClass
attr_accessor :name
def initialize(arg_str) # called on MyClass.new("string")
@name = arg_str # initialize an instance variable
end
def dup
the_copy = super # shallow copy calling Object.dup
@name = @name.dup # new copy of istance variable
return the_copy # return the copied object
end
end
这是一个非常简单、非常具体的“深度复制”实现。它所展示的是创建一个独立的@name
克隆中的实例变量,以便使用就地操作修改实例变量的名称不会产生更改克隆的副作用。
通常,深复制操作对于嵌套数组或哈希之类的东西很重要,但它们也适用于具有引用此类事物的属性的任何对象。
在你的情况下,要制作一个更强大的对象dup
方法,你应该调用dup
关于每个有问题的属性,但我认为这个例子有点糟糕。它的作用是替换@name
在原件中附上副本,这可能会破坏您拥有的任何参考资料。
更好的版本是:
def dup
copy = super
copy.make_independent!
copy
end
def make_independent!
instance_variables.each do |var|
value = instance_variable_get(var)
if (value.respond_to?(:dup))
instance_variable_set(var, value.dup)
end
end
end
这应该具有复制支持的任何实例变量的效果dup
方法。这会跳过数字、布尔值等内容nil
这是无法复制的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)