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

#1 楼

使用next

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


印刷品:

1
3   
5
7
9


要获得更多的凉爽性,还请检查redoretry。 br />
也可用于timesuptodowntoeach_with_indexselectmap和其他迭代器(以及更常见的块)之类的朋友。

有关更多信息,请参见http:// ruby -doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UL。

评论


是的,虽然break并不是那么酷(并且更有用;)。

–雅各布·汉普(Jakub Hampl)
2010-11-19 23:47

在这种情况下,中断是错误的答案。它停止.each而不只是保持1个循环。 ;)

–thanhnha1103
16年6月20日在10:39

#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是错误的。

故意在一个块内使用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而不是内部块。

评论


给出下一个n的示例而不是return foo会更有趣。

– ANeves认为SE是邪恶的
2013年9月26日在12:04

@ANeves感谢您的反馈;已修改以更好地对比下一个/返回。

–阿什拉
2013年9月26日14:06