在 Ruby 中,如何跳过 .each 循环中的循环,类似于“继续”[重复]

Posted

技术标签:

【中文标题】在 Ruby 中,如何跳过 .each 循环中的循环,类似于“继续”[重复]【英文标题】:In Ruby, how do I skip a loop in a .each loop, similar to 'continue' [duplicate] 【发布时间】:2011-05-12 22:24:10 【问题描述】:

在 Ruby 中,如何跳过 .each 循环中的循环,类似于其他语言中的 continue

【问题讨论】:

【参考方案1】:

使用next

(1..10).each do |a|
  next if a.even?
  puts a
end

打印:

1
3   
5
7
9

若想更酷,请查看redoretry

也适用于timesuptodowntoeach_with_indexselectmap 和其他迭代器(以及更普遍的块)等朋友。

欲了解更多信息,请参阅http://ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UL。

【讨论】:

是的,虽然 break 不是那么酷(而且更有用;)。 break 在这种情况下是错误的答案。它停止 .each 而不仅仅是保持 1 个循环。 ;)【参考方案2】:

next - 就像return,但用于块! (所以你也可以在任何proc/lambda 中使用它。)

这意味着你也可以说 next n 从块中“返回”n。例如:

puts [1, 2, 3].map do |e|
  next 42 if e == 2
  e
end.inject(&:+)

这将产生46

注意return总是从最近的def返回,而不是一个块;如果周围没有defreturning 是错误的。

故意在块内使用return 可能会造成混淆。例如:

def my_fun
  [1, 2, 3].map do |e|
    return "Hello." if e == 2
    e
  end
end

my_fun 将导致"Hello.",而不是[1, "Hello.", 2],因为return 关键字属于外部def,而不是内部块。

【讨论】:

举一个next n的例子会更有趣,而不是return foo @ANeves 感谢您的反馈;已修改以更好地对比next/return

以上是关于在 Ruby 中,如何跳过 .each 循环中的循环,类似于“继续”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 ruby​​ 中告诉 .each 循环的结束

For Each 循环:循环通过 Outlook 邮箱删除项目时,某些项目会被跳过

Ruby 中的“for”与“each”

jquery如何控制循环里面的层的显示与隐藏

Ruby each_with_index 偏移量

小猪的数据结构辅助教程——2.4 线性表中的循环链表