在 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
若想更酷,请查看redo
和retry
。
也适用于times
、upto
、downto
、each_with_index
、select
、map
和其他迭代器(以及更普遍的块)等朋友。
欲了解更多信息,请参阅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
返回,而不是一个块;如果周围没有def
,return
ing 是错误的。
故意在块内使用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 循环中的循环,类似于“继续”[重复]的主要内容,如果未能解决你的问题,请参考以下文章