如何在ruby中深度复制队列

时间:2014-06-24 08:07:06

标签: ruby queue deep-copy

在下面的代码中,Object方法clonedup会复制q1的指针,并且不会对其进行深层复制。

q1 = Queue.new
q1.push(1) # => 1
q1.push(2) # => 1,2
q2 = q1.clone
q2.pop # => 1
puts q1.size # => 1 (not 2)

我试过这个How do I copy a hash in Ruby?,但它也不起作用。我想知道为什么Queue实例没有被深层复制。是为了线程安全吗?

1 个答案:

答案 0 :(得分:1)

每个Ruby类都负责实现自己的clonedup行为。有时,这表现为一个非常弱的实现,但没有正确执行。

队列似乎没有实现clone,它不在the documentation中,因此它依赖于显然不足以执行此任务的Object#clone方法。所有这一切都是将实例变量复制到一个新容器中,但它不会修改实例变量本身。无论队列内部使用什么都不受影响。

简而言之,有些事情可以轻易克隆,有些事情则更难克制。

如果你真的需要克隆一个队列,也许你可以序列化它并反序列化它,尽管这通常会导致巨大的性能损失。

Queue似乎不支持Enumerable,因此限制了提取和复制数据的选项。我猜想Queue的性能问题是这样的便利方法被省略了。