2013-03-20 56 views
0

我遇到了这个奇怪的错误,其中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。

回答

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

这是因为这两个dj_ids和@job .data ['dj_ids']正在接受同一个对象。所以你正在迭代和删除在同一时间。

您可以更改第二行dj_ids = @ job.data [ 'dj_ids']。克隆或dj_ids = @ job.data [ 'dj_ids'。DUP,它应该工作

相关问题