这个问题在这里已有答案:
在Ruby中,如何跳过 .each 循环中的循环,类似于其他语言中的 continue ?
.each
continue
使用 next :
next
(1..10).each do |a| next if a.even? puts a end
打印:
1 3 5 7 9
如需额外的凉爽,请查看 redo 和 retry .
redo
retry
也适用于像 times , upto , downto , each_with_index , select , map 和其他迭代器(以及更常见的块)这样的朋友 .
times
upto
downto
each_with_index
select
map
有关详细信息,请参阅http://ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UL .
next - 它就像 return ,但是对于块! (所以你也可以在任何 proc / lambda 中使用它 . )
return
proc
lambda
这意味着你也可以从块中说 next n 到"return" n . 例如:
next n
n
puts [1, 2, 3].map do |e| next 42 if e == 2 e end.inject(&:+)
这将产生 46 .
46
注意 return 总是从最接近的 def 返回,而不是块;如果没有周围 def , return ing是一个错误 .
def
故意使用块内的 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 ,而不是内部块 .
my_fun
"Hello."
[1, "Hello.", 2]
2 回答
使用
next
:打印:
如需额外的凉爽,请查看
redo
和retry
.也适用于像
times
,upto
,downto
,each_with_index
,select
,map
和其他迭代器(以及更常见的块)这样的朋友 .有关详细信息,请参阅http://ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UL .
next
- 它就像return
,但是对于块! (所以你也可以在任何proc
/lambda
中使用它 . )这意味着你也可以从块中说
next n
到"return"n
. 例如:这将产生
46
.注意
return
总是从最接近的def
返回,而不是块;如果没有周围def
,return
ing是一个错误 .故意使用块内的
return
会让人感到困惑 . 例如:my_fun
将导致"Hello."
,而不是[1, "Hello.", 2]
,因为return
关键字属于外部def
,而不是内部块 .