如何在ruby中深度复制队列



在下面的代码中,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)

我试过这个我如何在Ruby中复制哈希?,但它也不起作用。我想知道为什么Queue实例没有深度复制。是为了线程安全吗?

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

Queue似乎没有实现clone,它不在文档中,因此它依赖于Object#clone方法,这显然不足以完成此任务。它所做的只是将实例变量复制到一个新的容器中,但并不修改实例变量本身。Queue使用的任何内部组件都不受影响。

所以简而言之,有些东西很容易克隆,有些则很难。

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

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

最新更新