在下面的代码中,Object
方法clone
或dup
会复制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
实例没有被深层复制。是为了线程安全吗?
答案 0 :(得分:1)
每个Ruby类都负责实现自己的clone
和dup
行为。有时,这表现为一个非常弱的实现,但没有正确执行。
队列似乎没有实现clone
,它不在the documentation中,因此它依赖于显然不足以执行此任务的Object#clone
方法。所有这一切都是将实例变量复制到一个新容器中,但它不会修改实例变量本身。无论队列内部使用什么都不受影响。
简而言之,有些事情可以轻易克隆,有些事情则更难克制。
如果你真的需要克隆一个队列,也许你可以序列化它并反序列化它,尽管这通常会导致巨大的性能损失。
Queue
似乎不支持Enumerable
,因此限制了提取和复制数据的选项。我猜想Queue的性能问题是这样的便利方法被省略了。