在Ruby中,如何跳过.each循环中的循环,类似于'continue'

时间:2010-11-19 23:32:30

标签: ruby loops syntax iteration

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

2 个答案:

答案 0 :(得分:534)

使用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

答案 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,而不是内部块。