在下面的代码中,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)
我试过这个我如何在Ruby中复制哈希?,但它也不起作用。我想知道为什么Queue
实例没有深度复制。是为了线程安全吗?
每个Ruby类负责实现自己的clone
和dup
行为。有时这表现为一个非常弱的实现,不能正确地执行。
Queue似乎没有实现clone
,它不在文档中,因此它依赖于Object#clone
方法,这显然不足以完成此任务。它所做的只是将实例变量复制到一个新的容器中,但并不修改实例变量本身。Queue使用的任何内部组件都不受影响。
所以简而言之,有些东西很容易克隆,有些则很难。
如果你真的需要克隆一个Queue,也许你可以序列化它和反序列化它,尽管这通常会导致巨大的性能损失。
Queue
似乎不支持Enumerable
,因此限制了您提取和复制数据的选项。我猜想Queue的性能问题是这样的,所以像这样的便利方法被省略了。