首页 > 解决方案 > 迭代器不包括在循环内添加到它的值

问题描述

我有:

ids = [1]

我正在ids.each do |id|循环ids并寻找要添加到ids. 这是我的代码:

ids.each do |id|
  # Do some things
  ids |= search_for_more_ids(id)
end

在第一次迭代期间,ids获得第二个值并成为[1, 2]. 但是循环在第一次迭代时仍然存在。迭代器只运行一次;第二个值永远不会被访问。这很奇怪,因为这曾经有效。

任何帮助,将不胜感激。

标签: rubyiterator

解决方案


ids 现在是 [1,2]

是的, nameids现在指向一个包含 content 的数组1, 2,但这是一个完全不同的数组。当您输入时,不是您为其创建迭代器的那个.each

在改变我正在迭代的集合之前,我会认真思考(两次),但如果你坚持,那么至少改变同一个集合并且不要创建一个新集合。(这意味着,使用push,而不是|=


好的,那么对于这样的事情,最好的解决方案是什么?

这看起来像一个作业队列。这传统上是通过堆栈或队列来实现的。为简单起见,我们将在这里使用一个数组。

ids = [1]

loop do
  id = ids.shift
  puts id # your processing
  ids.concat(search_for_more_ids(id))
  break if ids.empty?
end

推荐阅读