2013-03-20 86 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,它應該工作

相關問題