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] 甚至从未被调用,因此没有被删除。我似乎无法弄清楚可能是什么原因。

核磁共振红宝石 1.9.3。

4

2 回答 2

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可以避免这种情况

于 2013-03-20T07:25:52.430 回答
1

这是因为 dj_ids 和 @job.data['dj_ids'] 都指向同一个对象。所以你同时迭代和删除。

您可以将第二行更改为 dj_ids = @job.data['dj_ids'].clone 或 dj_ids = @job.data['dj_ids'].dup 它应该可以工作

于 2013-03-20T07:26:39.170 回答