Rubyのnextとbreakキーワードを徹底解説!使い方と注意点をマスターしよう
nextやbreakといったキーワードは、Rubyプログラミング言語の一部です。Rubyを完全に理解したいなら、これらの仕組みを知っておく必要があります。
nextとbreakは何のために使うのか?
Rubyには、さまざまな種類のループが用意されています。
たとえば:
- while
- until
- each
ループを書いていると、「特定のイテレーションをスキップしたい」「ループを途中で終了させたい」という場面に出くわすことがあります。
そんなときに活躍するのがnextとbreakキーワードです!
それでは、具体的な使い方を見ていきましょう。
Rubyのnextキーワード(イテレーションのスキップ)
nextキーワードを使うと、1回のイテレーションをスキップできます。
例:
文字列の長さを合計してカウントする処理を考えてみましょう。
何らかの理由で、長さが4の文字列はカウントしたくないとします。
このように書けそうです:
strings = ["one", "two", "four", "five"] strings.inject(0) do |sum, str| next if str.size == 4 sum + str.size end # nil
しかし、このコードはうまく動きません。
結果はnilになってしまいます。
なぜでしょうか?
理由は、nextがデフォルトでnilを返すからです。戻り値を指定しないreturnと同じ挙動です。
ご存じのとおり…
injectは、ブロックが最後に返した値を、次のイテレーションの第1引数として受け取ります。
つまり、sumがnilになってしまうのです。
解決策は?
nextの行を次のように変更します。
next sum if str.size == 4
こうすることで、nextがsumの値を返すようになります。
パフォーマンスが最優先でない場合(多くの場合そうではありません)、nextを使わずに済むよう、配列を事前にフィルタリングする方法もあります。
さらに良い方法はこちら:
strings = ["one", "two", "four", "five"]
strings.inject(0) { |sum, str| str.size == 4 ? sum : sum + str.size }
# 6
これは三項演算子を使った書き方です。
Rubyにはnextを使わずに済むための道具が十分に揃っています。ぜひ活用しましょう!
Rubyのbreakキーワード(ループの早期終了)
breakキーワードはnextと似ていますが、1回のイテレーションをスキップするのではなく、ループを終了させて値を返します。
ループからの早期リターンに使えます。
なぜ
returnキーワードを使わないのか? それは、returnはループだけでなく、現在のメソッド全体を抜けてしまうからです。
また、無条件ループを終了させるためにも使えます。
たとえば:
count = 0 loop do break if count == 10 puts count count += 1 end
このコードは、0から9までの数字のリストを出力します。
より良い代替手段としては、timesメソッド、uptoメソッド、あるいは範囲(Range)とeachメソッドの組み合わせがあります。
例:
0.upto(9).each(&method(:puts))
この&method(:puts)は、各数字に対してputsを呼び出すためのショートカットです。
混乱を避けよう:メソッドとしてのnext
キーワードとして存在するからといって、メソッド名として使えないわけではありません。
Rubyの一部のクラスは、nextをメソッドとして実装しています。
たとえばStringクラスやIntegerクラスです。
例:
1.next # 2
この結果は驚きではないですよね?
では、これはどうでしょう:
"zz".next # "aaa"
こちらは少し面白いですね!
どのような仕組みなのでしょうか?
実は、各クラスがそれぞれ独自のnextメソッドを実装していて、「次の値」を求めるロジックが含まれています。
Integerの場合は、単純に+1するだけです。
Stringの場合は、最後の文字を1つ進めます(アルファベットなら次の文字、数字なら+1)。そして、桁上がりが発生した場合(9 → 0、z → a)、左隣の文字をさらに1つ進めます。
まとめ
この記事では、Rubyのnextとbreakキーワードについて学びました。これらを使いこなせるようになると、イテレーションのスキップやループの早期終了が自由自在に行えます。
それでは、あなたの番です。Rubyのスキルを練習してみてください🙂
最後までお読みいただき、ありがとうございました!
-
Rubyのputs・print・pの違いとは?出力メソッドの使い分けを徹底解説
Rubyには、画面に何かを出力するための方法がいくつかあります。中でも特によく使われるのが、以下の3つのメソッドです。 puts print p しかし、これらは一体どう違うのでしょうか?そしてどんな場面でどれを使えばよいのか?この記事では、それぞれの特徴と使い分けのポイントを詳しく解説します。 改行なしで出力する方法 ユーザーに見せるために画面へ何かを出力したいときは、通常putsを使用します。 例: puts Hello there! putsは、実行するたびにメッセージの末尾へ自動的に改行を追加します。 もし改行したくない場合は、printを使いましょう。 例: print 1
-
【Ruby】デコレータデザインパターンでクラスを変更せずにオブジェクトを拡張する方法
デコレータ(Decorator)デザインパターンとは、どのようなものなのでしょうか? また、このパターンをRubyのプロジェクトではどのように活用すればよいのでしょうか? デコレータデザインパターンを利用すると、クラスそのものを変更することなく、オブジェクトに新しい機能を追加して拡張することができます。 それでは、具体的な例を見ていきましょう! ログ出力とパフォーマンス計測の実装例 この例では、rest-clientのようなGemを使ってHTTPリクエストを送信します。 コードは次のようになります。 require restclient data = RestClient.get(www.