web-dev-qa-db-ja.com

Rubyでは、 'continue'と同様に、どのようにして.eachループ内のループをスキップするのですか。

Rubyでは、他の言語のcontinueのように、どのようにして.eachループ内のループをスキップするのですか?

306
Blankman

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 をご覧ください。

535
Jakub Hampl

next - returnのようですが、ブロック用です。 (したがって、これは任意のproc/lambdaでも使用できます。)

つまり、ブロックからnを「返す」ためにnext nと言うこともできます。例えば:

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

これは46をもたらします。

return常には最も近いdefから返され、ブロックになることはありません。周囲にdefがない場合、returningはエラーです。

意図的にブロック内からreturnを使用することは混乱を招く可能性があります。例えば:

def my_fun
  [1, 2, 3].map do |e|
    return "Hello." if e == 2
    e
  end
end

returnキーワードは内側のブロックではなく外側のdefに関連するため、my_fun"Hello."ではなく[1, "Hello.", 2]になります。

46
Ashe