gpt4 book ai didi

ruby - 为什么 Ruby 中没有深拷贝方法?

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

我正在研究技术图纸 (svg/ruby) 的解决方案。我想操作矩形,并且在这个类中有一个 add! 方法:

class Rect
def add!(delta)
@x1+=delta
... # and so on
self
end
end

我还需要一个 add 方法返回一个 Rect,但不操作 self:

def add(delta)
r=self.dup/clone/"copy" # <-- not realy the 3 and no quotes, just in text here
r.add! delta
end

dupclone 不做我的事但是:

def copy; Marshal.load(Marshal.dump(self)); end

会。

为什么普通 Ruby 中不存在这样的基本功能?请不要告诉我我可以颠倒 addadd!,让 add 完成工作,然后 add! 调用它。

最佳答案

我不确定为什么 Ruby 中没有深层复制方法,但我会尝试根据我能找到的信息做出有根据的猜测(请参阅行下方的链接和引号)。

从这些信息来看,我只能推断 Ruby 没有深拷贝方法的原因是因为它很少需要,在少数真正需要的情况下,还有其他相对简单的方法来完成相同的任务:

如您所知,目前推荐使用 Marshal.dumpMarshal.load 来执行此操作。这也是 Programming Ruby 推荐的方法(请参阅下面的摘录)。

或者,在这些 gems 中至少有 3 个可用的实现:deep_cloneable , deep_cloneruby_deep_clone ;第一个是最受欢迎的。


相关信息

这是 a discussion over at comp.lang.ruby这可能会对此有所启发。有 another answer here与一些相关的讨论,但一切都回到使用 Marshal

Programming Ruby 中没有提到深度复制, 但在 The Ruby Programming Language 中提到了一些.以下是一些相关的摘录:

[…]

Another use for Marshal.dump and Marshal.load is to create deep copies of objects:

def deepcopy(o)
Marshal.load(Marshal.dump(o))
end

[…]

… the binary format used by Marshal.dump and Marshal.load is version-dependent, and newer versions of Ruby are not guaranteed to be able to read marshalled objects written by older versions of Ruby.

[…]

Note that files and I/O streams, as well as Method and Binding objects, are too dynamic to be marshalled; there would be no reliable way to restore their state.

[…]

Instead of making a defensive deep copy of the array, just call to_enum on it, and pass the resulting enumerator instead of the array itself. In effect, you’re creating an enumerable but immutable proxy object for your array.

关于ruby - 为什么 Ruby 中没有深拷贝方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912476/

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