Rubyのプログラムでもwhileやforなどによる繰り返しがよく使われており、中にはbreakを使ってその繰り返しを中断する処理も使います。しかし、Rubyのbreakは、他のプログラミング言語のbreakと少し違うのをご存じでしょうか。
今回は、Rubyにおけるbreakの使い方を例を使って詳しく解説します。
Rubyにおける繰り返し制御構造の基本
Rubyでは、配列を操作する便利なメソッドがたくさんあるので、わざわざ繰り返し制御構造のプログラムを書く機会が少ないかもしれません。しかし、繰り返し制御が必要なケースはいろいろあります。そして、その途中で、breakで中断する処理もあるでしょう。
breakについて解説する前に、Rubyにおける繰り返し制御の書き方の基本について説明します。
繰り返し制御の基本はwhile
Rubyの文法はC言語の影響を受けていますが、C言語の繰り返し処理で真っ先に挙げられるのがwhileです。そして、このwhileは、Rubyはもちろん、多くのプログラム言語で使えます。
Rubyにおけるwhileの文法
while 式 [do]
…
break
end
(doは省略できます)
whileの繰り返しから抜ける方法は2つあり、1つはwhileに続く式が偽の場合であり、もう1つはbreakによる中断です。
なお、Rubyでは、whileの代わりにuntilを使って、繰り返し制御を記述できます。また、その繰り返し処理を中断する方法は、whileと同じで、breakも使えます。
until の文法
iuntil 式 [do]
…
break
end
(doは省略できます)
範囲の中だけ繰り返すfor
Rubyにおけるforは、C言語よりもJavaのforに近い書き方で、繰り返し処理を記述します。そのため、配列などのオブジェクトの個数分、繰り返しを実行する書き方です。しかし、その処理の中にbreakを記述することで、繰り返し処理の中断が可能です。
Rubyのfor文の文法
for 要素1… in オブジェクト [do]
…
break
end
(doは省略できます)
イテレータによる繰り返し
Rubyでは、これまで説明したwhile, until, forといった繰り返し制御の他に、イテレータで繰り返し処理を作ることが可能です。
例えば、配列にeachメソッドを指定するだけで、その配列の要素の数だけ繰り返します。そして、その繰り返しの途中でbreakを使うすることで、イテレータの繰り返しの中断も可能です。
イテレータの例(eachメソッド)
オブジェクト.each { |変数|
実行する処理
if 条件 then
break
end
}
または、
オブジェクト.each do |変数|
実行する処理
if 条件 then
break
end
end
breakの使い方の基本
先ほど紹介したように、Rubyで使える繰り返し処理のほとんどで、breakによる中断が可能です。次から、繰り返し処理を中断する際に使用するbreakの文法とその使い方について解説します。
breakの文法
Rubyにおけるbreakは、繰り返し処理を中断するための制御構造です。そのため、クラスに関係なく使用できます。なお、breakで中断できる繰り返し制御とは、先ほど解説した次の4つです。
while
until
for
イテレータ
また、使い方は簡単で、繰り返し処理の中に記述するだけです。次に、breakを使った簡単な例を紹介します。
breakの使用例 i=0 while( true ) do i+=1 if i == 10 then break end end
この例は、無限ループのwhileの中で、変数iが10になったらbreakによって中断する例です。
もっとも内側のループを中断する
Rubyのbreakには、もっとも内側の繰り返しを中断する、というルールもあります。なお、while、until、forなど、繰り返し制御の書き方は幾つもありますが、されらが重複して使われるケースは珍しくありません。
しかし、breakで、それらの繰り返しの全てを中断する、ということはありません。繰り返し制御が重複している場合、breakは最も内側の繰り返しを中断します。
例えば、下記のように外側がfor、内側がwhileの場合、whileの中にbreakがあると、whileの繰り返しのみ中断し、外側のforはそのまま処理が継続されます。
for i in obj do ... while ( state ) do ... if check then break end end end
Rubyの繰り返しは戻り値を持つ
通常のプログラムでは使いませんが、Rubyのwhileは戻り値を持っており、通常はnilを返します。また、breakで中断した場合も、whileの戻り値はnilです。しかし、Rubyのbreakに引数を指定することで、whileに戻り値を設定できます。
breakで戻り値を設定する文法
break 戻り値
breakで戻り値を設定した例 i=0 val = while(true) do i+=1 if i == 10 then break 10 end end echo val
この例では、iが10になったらbreakによってwhileを中断し、breakに設定した戻り値をvalに代入しています。
Rubyではcase文には使わない
C言語を学んだ方なら、switch文でもbreakを使うことをご存じでしょう。今使われている多くのプログラム言語がC言語の文法を参考にしていることから、C言語のswitch文と同じ制御もいろいろなプログラム言語で使えます。しかし、同じ機能を実現するRubyのcase文では、breakは使用しません。
C言語のswitch文とRubyのcase文の比較
breakの使われ方の違いを理解するために、C言語のswitch文とRubyのcase文を比較してみましょう。まず、C言語のswitch文の文法は、次のとおりです。
switch(式) {
case 定数1:
式が定数1の場合の処理;
break;
case 定数2:
式が定数2の場合の処理;
break;
default:
式がどの定数にも一致しない場合の処理;
}
このように、C言語のswitch文では、case文の終了にbreakが必要です。もし、breakが無い場合は、すぐ下に書かれた違う定数に一致した場合の処理も実行してしまいます。
続いて、先ほどのC言語のswitch文と同じ処理をRubyのcase文で書くと、次のようになります。
case 式
when 定数1 then
式が定数1の場合の処理
when 定数2 then
式が定数2の場合の処理
else
式がどの定数にも一致しない場合の処理
end
このように、Rubyではbreakを使いません。Rubyのwhenは、C言語のcaseと違い、次のwhenの前までしか処理しません。この点、C言語と大きく違う点なので、注意してください。
breakの使い方の例
これまで、breakの文法を説明するために、簡単な例を使い、その使い方を説明してきました。Rubyではそれらと違った書き方も可能です。次から、そのような特殊なbreakの使い方を紹介します。
一般的な使い方の例
これまで紹介したように、breakは一般的に、if文などで評価した結果、繰り返し処理を中断するのに使います。例えば先ほど紹介した下記の例のように、if文のthenとendの間に入れるのが一般的です。
if文を使ったbreakの使用例 i=0 while( true ) do i+=1 if i == 10 then break end end
if修飾子でbreakを使う
Rubyでは、if文と同じ機能をif修飾子でも書けます。なお、if修飾子とは、ifの左右に式を書き、右側の式が真の場合は、左側の式を実行する処理を記述する修飾子です。
if修飾子の文法
式 if 式
if修飾子の左側にbreakを記述し、右側に条件を書くことで、先ほどの一般的な使い方の例を同じようなプログラムを書くことが可能です。
if修飾子でbreakを使った例 i=0 while(true) do i+=1 break if i==10 end
この例では、while文で作られた繰り返し処理でiに1を加えた後、もし、i=10なら繰り返しを中断する処理です。if修飾子を使い、i==10の場合にbreakを実行しています。
三項演算子でbreakを使う
三項演算子の使い方をご存じでしょうか。三項演算子とは、条件演算子とも呼ばれますが、条件の結果によって、真の場合の式と偽の場合の式を、1行で書ける演算子です。そして、この書き方はRubyでもよく使われます。
三項演算子の文法
条件 ? 真の場合の式 : 偽の場合の式
この三項演算子の式にbreakを指定することで、繰り返し処理を中断させることが可能です。
三項演算子でbreakを使った例 i=0 while(true) do i < 10 ? i+=1 : break end
この例は、while文で作られた繰り返し処理で、「i < 10」の場合はiに1を加え、そうでない場合、つまり「i == 10」になった時点でbreakによって繰り返すを中断する例です。そして、この例のように簡単な処理であれば、if文を使った書き方よりも短く記述できます。
まとめ
breakは、繰り返し処理を中断する命令として多くのプログラム言語で使えますが、もちろんRubyでも使えます。ただし、case文はC言語などのswitchと仕様が違うので、breakは使いません。Rubyでは、breakを繰り返し処理の中断にのみ使います。
なお、breakは、if文の条件に一致した場合のみ、繰り返し処理を中断するのが一般的です。さらに、今回紹介したようにif修飾子や三項演算子でもbreakが利用できます。シンプルに記述できるので、if修飾子や三項演算子を使った書き方も、ぜひ、活用してください。