调查员跳过元素。无法弄清楚原因

时间:2013-03-20 07:20:51

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

我正在经历这个奇怪的错误,其中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。

2 个答案:

答案 0 :(得分: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来避免这个

答案 1 :(得分:1)

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

您可以将第二行更改为dj_ids = @ job.data ['dj_ids']。clone或dj_ids = @ job.data ['dj_ids']。dup并且它应该可以使用