gpt4 book ai didi

ruby - 在 Ruby 类上定义哪个方法来为其实例提供复制/克隆?

转载 作者:数据小太阳 更新时间:2023-10-29 06:48:41 25 4
gpt4 key购买 nike

我有一个具有单个属性 :contentsPointer 类,它指向 MyObject 类的对象。

class MyObject
def hello; "hello" end
end

class Pointer
attr_reader :contents
def initialize( cont ); @contents = cont end
# perhaps define some more state
end

我希望我的 Pointer 能够 self 复制。我知道 #dup 方法是默认定义的,而 #clone 方法应该被覆盖以便能够进行深度复制。但是在这里,副本不必太深。所以,我遇到的第一个难题是,我是否应该重写 #dup 方法,因为我真的不想复制我的 Pointer 的附加状态,只是做一个指向同一个 MyObject 实例的新对象?还是我应该避免重写 #dup,因为我“不应该”使用制作浅拷贝的方法重写 #clone

我欢迎对以上内容发表评论,但假设我会选择覆盖 #dup。我可以这样做:

class Pointer
def dup; self.class.new( contents ) end
end

但是在网上,我读到类似“dup 方法将调用初始化复制 方法”之类的内容。另外,this guy写了关于 Ruby 中的 #initialize_clone#initialize_dup#initialize_copy。这让我想知道,最好的做法可能是这样的吗?

class Pointer
def initialize_copy
# do I don't know what
end
end

还是这样?

class Pointer
def initialize_dup
# do I don't know what
end
end

或者我应该忘记那些让初学者感到困惑的在线咆哮,而去无忧无虑地覆盖 #dup 吗?

此外,我明白我可以调用 #dup 而无需定义任何自定义 #dup,但是 if 我想定义什么#dup 具有不同的行为?

此外,同样的问题也适用于 #clone - 我应该尝试定义 #initialize_clone 还是只定义 #clone

最佳答案

根据我的经验,重载#initialize_copy 工作得很好(从未听说过 initialize_dup 和 initialize_clone)。

原始的 initialize_copy(用原始对象的值初始化每个实例变量)可以通过 super 获得,所以我通常这样做:

class MyClass
def initialize_copy(orig)
super
# Do custom initialization for self
end
end

关于ruby - 在 Ruby 类上定义哪个方法来为其实例提供复制/克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11945176/

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