2013-03-20 3 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 и он должен работать

Смежные вопросы