ブロックから早期に何かを返すにはどうすればよいですか?


90

私がこのようなことをしたい場合:

collection.each do |i|
   return nil if i == 3

   ..many lines of code here..
end

どうすればその効果を得ることができますか?ブロック内のすべてを大きなifステートメントでラップできることはわかっていますが、可能であればネストは避けたいと思います。

残りの要素の反復を停止したくないので、ここではブレークは機能しません。

回答:


176

nextブロック内はブロックから戻ります。breakブロック内は、ブロックに譲った関数から戻ります。eachこの手段breakのループを終了し、nextループ(したがって名前)の次の繰り返しにジャンプします。next valueとで値を返すことができますbreak value


53
next valueおよびの+1 break value。まさに私が探していたもの。
Joshua Pinter 2012年

1
break valueうまくいきましたが、私にnext valueはうまくいきませんでした。どうもありがとう。
フランチェスコベラドンナ2013

4
nextとbreakの定義が正しいかわかりません。少なくとも、彼らは混乱しています。breakは最も内側のループを終了し、nextは次の反復に移動します。出典:tutorialspoint.com/ruby/ruby_loops.htm
WattsInABox 2013

3
@WattsInABoxnextbreakあり、ループ構造に固有のものではないため、リンクした記事は非常に誤解を招く可能性があります(反対のことを強く示唆しているため)。そして、私の説明は間違いなくときに正しいですnextし、breakブロック内で使用されている(なおwhilefor、これまでの用途の99%ので、Rubyで使用した場合、まれにしかありませんnextし、breakブロック内にあります)。
sepp2k 2013

私はあなたが非ループブロックを意味すると思います。それはそれについて混乱しているものです。また、私はあなたの99%の主張に同意しませんが、それは別の議論です。
WattsInABox 2013

11
#!/usr/bin/ruby

collection = [1, 2, 3, 4, 5 ]

stopped_at = collection.each do |i|
   break i if i == 3

   puts "Processed #{i}"
end

puts "Stopped at and did not process #{stopped_at}"

5

この場合、breakを使用してループを早期に終了できます。

collection.each do |i|
  break if i == 3
  ...many lines
end

...もちろん、これは、実際に値を返すことを目的としておらず、ブロックから抜け出すことを前提としています。


これはブロックから戻るだけでなく、それぞれから戻ります。したがって、ループは終了し、次の値で続行されません。それが意図されていることかどうかはわかりません。
sepp2k 2010年

4
あなたはとの値を使用することができbreakRubyで-break 5原因となりますeach。5.を返すために
チャック

1
ありがとう、でも繰り返しを止めたくない。
ryeguy 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.