gpt4 book ai didi

Ruby:对象深度复制

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:59 24 4
gpt4 key购买 nike

我正在研究一些在 Ruby (MRI 1.9.3) 中深度复制对象的技术。
我遇到了以下示例,但我不确定 #dup 方法的实现。我测试了它,它确实有效,但我不理解该方法的逻辑步骤,因此我不太愿意在自己的代码中使用它。

@name = @name.dup 语句是否引用副本内部 中的 iVar?如何?我看不到它。

谁能解释一下,好吗?
另外,有没有更好的方法?

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 方法的实例变量的效果。这将跳过诸如数字、 bool 值和不能重复的 nil 之类的内容。

关于Ruby:对象深度复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14104542/

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