【问题标题】:Enumerator skipping elements. Unable to figure out why枚举器跳过元素。无法弄清楚为什么
【发布时间】:2013-03-20 07:20:51
【问题描述】:

我遇到了一个奇怪的错误,其中 Enumerator 跳过了中间元素对象。一直在为此绞尽脑汁。 http://pastie.org/6636093

@job.data['dj_ids'] = [1,2,3]
dj_ids = @job.data['dj_ids'] # => [1,2,3]

dj_ids.each do |t|
  puts t
  @job.data['dj_ids'].delete(t)
end

# Output:
# 1
# 3

# @job.data['dj_ids'] => [2]

这很奇怪,[2] 甚至从未被调用,因此没有被删除。我似乎无法弄清楚可能是什么原因。

MRI Ruby 1.9.3。

【问题讨论】:

    标签: ruby arrays ruby-on-rails-3 enums


    【解决方案1】:

    当你调用 dj_ids = @job.data['dj_ids'] dj_ids 只是一个参考,所以当你调用 @job.data['dj_ids'].delete(t) 你删除元素和 dj_ids[1] 变成 3

    您可以通过dj_ids = @job.data['dj_ids'].dup 来避免这种情况

    【讨论】:

      【解决方案2】:

      这是因为 dj_ids 和 @job.data['dj_ids'] 都指向同一个对象。所以你在迭代和删除的同时。

      您可以将第二行更改为 dj_ids = @job.data['dj_ids'].clone 或 dj_ids = @job.data['dj_ids'].dup 应该可以工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多