【问题标题】:How to deep copy queue in ruby如何在 ruby​​ 中深度复制队列
【发布时间】:2014-08-14 09:47:40
【问题描述】:

在下面的代码中,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 实例没有被深度复制。是为了线程安全吗?

【问题讨论】:

  • Queue.pop 顺便从队列的开头删除一个元素,所以q2.pop 将返回1 而不是您的示例中的2
  • 是的,我的意思是左边的元素 2。
  • 我明白了,这有点令人困惑,因为通常# => xx 表示表达式的返回值:)。
  • Yan,回复@Daniël 的观点,如果你想在q2.pop 之后显示q2 是什么,只需添加q2 # => 2 行。

标签: ruby queue deep-copy


【解决方案1】:

每个 Ruby 类负责实现自己的 clonedup 行为。有时这表现为一个非常弱的实现,没有正确地做到这一点。

Queue 似乎没有实现clone,它不在the documentation 中,所以它依靠Object#clone 方法显然不足以完成这项任务。所做的只是将实例变量复制到一个新容器中,但它不会修改实例变量本身。 Queue 使用的任何内部结构都不受影响。

简而言之,有些东西很容易克隆,有些则要困难得多。

如果您确实需要克隆队列,也许您可​​以对其进行序列化和反序列化,尽管这通常会导致巨大的性能损失。

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

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2018-01-28
    • 2018-08-19
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多