Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyのnextとbreakキーワードを徹底解説!使い方と注意点をマスターしよう

nextbreakといったキーワードは、Rubyプログラミング言語の一部です。Rubyを完全に理解したいなら、これらの仕組みを知っておく必要があります。

nextとbreakは何のために使うのか?

Rubyには、さまざまな種類のループが用意されています。

たとえば

  • while
  • until
  • each

ループを書いていると、「特定のイテレーションをスキップしたい」「ループを途中で終了させたい」という場面に出くわすことがあります。

そんなときに活躍するのがnextbreakキーワードです!

それでは、具体的な使い方を見ていきましょう。

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引数として受け取ります。

つまり、sumnilになってしまうのです。

解決策は?

nextの行を次のように変更します。

next sum if str.size == 4

こうすることで、nextsumの値を返すようになります。

パフォーマンスが最優先でない場合(多くの場合そうではありません)、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 → 0z → a)、左隣の文字をさらに1つ進めます。

まとめ

この記事では、Rubyのnextbreakキーワードについて学びました。これらを使いこなせるようになると、イテレーションのスキップやループの早期終了が自由自在に行えます。

それでは、あなたの番です。Rubyのスキルを練習してみてください🙂

最後までお読みいただき、ありがとうございました!

  1. Rubyのputs・print・pの違いとは?出力メソッドの使い分けを徹底解説

    Rubyには、画面に何かを出力するための方法がいくつかあります。中でも特によく使われるのが、以下の3つのメソッドです。 puts print p しかし、これらは一体どう違うのでしょうか?そしてどんな場面でどれを使えばよいのか?この記事では、それぞれの特徴と使い分けのポイントを詳しく解説します。 改行なしで出力する方法 ユーザーに見せるために画面へ何かを出力したいときは、通常putsを使用します。 例: puts Hello there! putsは、実行するたびにメッセージの末尾へ自動的に改行を追加します。 もし改行したくない場合は、printを使いましょう。 例: print 1

  2. 【Ruby】デコレータデザインパターンでクラスを変更せずにオブジェクトを拡張する方法

    デコレータ(Decorator)デザインパターンとは、どのようなものなのでしょうか? また、このパターンをRubyのプロジェクトではどのように活用すればよいのでしょうか? デコレータデザインパターンを利用すると、クラスそのものを変更することなく、オブジェクトに新しい機能を追加して拡張することができます。 それでは、具体的な例を見ていきましょう! ログ出力とパフォーマンス計測の実装例 この例では、rest-clientのようなGemを使ってHTTPリクエストを送信します。 コードは次のようになります。 require restclient data = RestClient.get(www.