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 ルビー 1.9.3。

4

2 に答える 2

1

呼び出すときdj_ids = @job.data['dj_ids'] dj_idsは単なる参照なので、実行するときは@job.data['dj_ids'].delete(t)and 要素を削除してdj_ids[1]3 になります

dj_ids = @job.data['dj_ids'].dupこれを避けるためにできること

于 2013-03-20T07:25:52.430 に答える
1

これは、dj_ids と @job.data['dj_ids'] の両方が同じオブジェクトを参照しているためです。したがって、反復と削除を同時に行っています。

2 行目を dj_ids = @job.data['dj_ids'].clone または dj_ids = @job.data['dj_ids'].dup に変更すると、動作するはずです

于 2013-03-20T07:26:39.170 に答える