我正在经历这个奇怪的错误,其中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。
答案 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并且它应该可以使用