在Ruby中,如何跳过.each
循环中的循环,类似于其他语言中的continue
?
答案 0 :(得分:534)
使用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。
答案 1 :(得分:46)
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
是错误。
故意在块内使用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
,而不是内部块。