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

这个问题在这里已有答案:

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

回答(2)

2 years ago

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

2 years ago

next - 它就像 return ,但是对于块! (所以你也可以在任何 proc / lambda 中使用它 . )

这意味着你也可以从块中说 next n 到"return" n . 例如:

puts [1, 2, 3].map do |e|
  next 42 if e == 2
  e
end.inject(&:+)

这将产生 46 .

注意 return 总是从最接近的 def 返回,而不是块;如果没有周围 defreturn 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 ,而不是内部块 .