目次
開発環境
- Ruby version: ruby 3.1.2
Rubyのwhile文とは
Rubyのwhile文とは、条件式が真の間、繰り返し処理を実する制御構文です。
条件式がtrueの間は繰り返し処理が行われ、条件式がfalseになると繰り返し処理が止まります。
while文は条件式によって繰り返し回数が決まりますが、for文やeachメソッドはオブジェクトの要素数によって繰り返し回数が決まるという違いがあります。
公式リファレンス:https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#while
Rubyのwhile文の書き方
Rubyのwhile文の書き方を「while文の基本形」「while文の省略形」「while文の修飾子」をご紹介します。
Rubyのwhile文の基本形
1 2 3 | while 条件式 do 実行する処理 end |
「while」と「do」で囲まれた条件式がtrueの間は「do」と「end」で囲まれた処理が繰り返し実行されます。
また、「while」と「do」で囲まれた条件式がfalseになれば繰り返し処理が止まります。
そのため、条件式がtrueの間は繰り返し処理を実行するため、実行している処理の中で条件式の結果が変化するような処理を記述しなければなりません。
Rubyのwhile文の省略形
1 2 3 | while 条件式 実行する処理 end |
Rubyのwhile文はdoを省略することができます。
実際の開発ではdoを省略して書くことがほとんどなので、省略形で覚えるのがおすすめです。
Rubyのwhile修飾子
1 | 実行する処理 while 条件式 |
Rubyのwhile文は1行で書くことも可能です。
while装飾子は実行する処理を先に記述しているだけですが、while装飾子の記述方法は下記の処理内容と同様です。
1 2 3 | while 条件式 実行する処理 end |
分かりやすいコーディングを意識した場合、先に記述することで何を実行しようとしているのかが分かり易くなる場合があるため、たまに使用することがあります。
Rubyのwhile文の使い方
Rubyのwhile文のよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。
while文で繰り返し処理をするパターン
まずはwhile文の基礎である繰り返し処理をするパターンです。
1 2 3 4 5 6 7 8 | my_points = 0 while my_points < 10 get_points = rand(0..5) my_points += get_points puts "獲得ポイントは#{get_points}ポイントです。" puts "保有ポイントは#{my_points}ポイントです。" end |
上記は保有ポイントが10未満の間、ランダムに生成された0から5の整数が保有ポイントに足されていくというプログラムです。
保有ポイントが10ポイントを超えると繰り返し処理が止まります。
while文の繰り返し処理をbreak文で終了するパターン
次にwhile文の繰り返し処理をbreak文で終了するパターンです。
1 2 3 4 5 6 7 8 9 10 11 | my_points = 0 while my_points < 10 get_points = rand(0..5) if get_points == 0 break end my_points += get_points puts "獲得ポイントは#{get_points}ポイントです。" puts "保有ポイントは#{my_points}ポイントです。" end |
上記はランダムに生成された0から5の整数が0だった場合、while文の繰り返し処理を終了するというプログラムです。
while文の繰り返し処理をnext文でスキップするパターン
次にwhile文の処理をnext文でスキップするパターンです。
1 2 3 4 5 6 7 8 9 10 11 | my_points = 0 while my_points < 10 get_points = rand(0..5) if get_points % 2 == 0 next end my_points += get_points puts "獲得ポイントは#{get_points}ポイントです。" puts "保有ポイントは#{my_points}ポイントです。" end |
上記はランダムに生成された0から5の整数が偶数だった場合、while文の繰り返し処理をスキップするというプログラムです。
Rubyのwhile文で無限ループになった場合
Rubyのwhile文は、条件式がfalseになるまで繰り返し処理が行われてしまいます。
そのため、条件式が適切に記述していなければ無限ループとなり、最悪の場合はパソコンが壊れてしまう可能性もあります。
例えば下記のようなプログラムは無限ループになってしまいます。
1 2 3 4 5 | num = 0 while num <= 100 puts num end |
while文の処理が無限ループにならないようにするためには、下記のようにwhile文の処理中にカウントするなど、必ずループ処理の中で条件が「false」に変化するようにプログラムを記述する必要があります。
1 2 3 4 5 6 7 | num = 0 count = 0 while count <= 100 puts num count += 1 end |
もし、無限ループになってしまった場合は、慌てず「Control + C」で繰り返し処理を強制的に止めましょう。
おわりに
Rubyのwhile文の使い方を解説してきました。
実際のRuby環境での開発ではeachメソッドを使用する頻度が高くなりますが、while文も頻繁に使用する構文です。
オブジェクトの要素数に対して繰り返し処理をしたい場合はeachメソッド、あらかじめ決められた回数を繰り返し処理したい場合はfor文、ある条件が満たされている間は処理を繰り返したい場合はwhile文を使用するなど使い分けていきましょう。