ruby - 迭代器不包括在循环内添加到它的值
问题描述
我有:
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]
. 但是循环在第一次迭代时仍然存在。迭代器只运行一次;第二个值永远不会被访问。这很奇怪,因为这曾经有效。
任何帮助,将不胜感激。
解决方案
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
推荐阅读
- css - 如何在移动视图 Wordpress 主题中将侧边栏从页面底部移动到页面顶部
- bash - 仅将 grep 结果过滤到现有文件的路径
- arrays - 如何在 PostgreSQL 中将 jsonb 字段解析为没有键的列
- amazon-web-services - 使用 AWS IoT Core 规则和 AWS Lambda 处理嵌套 JSON 消息
- amazon-web-services - EventBridge 响应元素太大
- kubernetes - PromQL“where”子句
- git - 从 git diff 复制具有间隔名称的文件
- javascript - 来自具有相同类名的段落的输入或字符串的值总和始终显示“0”
- flutter - 如何从 Cloud Firestore 继承到另一个页面?
- antlr - 控制解析器规则替代优先级