whileのループ処理を学ぼう
学習の目標
本章では、以下の内容を学習します。
- whileループの基本的な使い方を理解する
- 条件付きの繰り返し処理を実装できるようになる
- breakを使ったループの制御方法を習得する
- 無限ループの作り方と適切な抜け出し方を学ぶ
はじめに
プログラミングでは、同じ処理を何度も繰り返し実行する必要がよくあります。例えば、100人分のデータを処理したり、ユーザーが正しい値を入力するまで何度も入力を求めたりするような場合です。
前回の章では、配列の要素を順番に処理するためのeach
メソッドについて学びました。これは特定のコレクション(配列やハッシュなど)の要素に対して繰り返し処理を行う場合に便利です。
今回学ぶwhileループは、より汎用的な繰り返し制御の仕組みです。「ある条件が真である間、処理を繰り返す」という形で使用します。特定の回数だけ処理を繰り返したい場合や、条件が満たされるまで処理を続けたい場合に便利です。
それでは、具体的な例を見ながらwhileループの使い方を一緒に学んでいきましょう。
whileループの基本
まずは、whileループの基本的な使い方を見てみましょう。while.rb
というファイルを作成し、以下のコードを書いてみてください。
count = 1while count <= 3 puts "#{count}回目の繰り返しです" count += 1end
このプログラムを実行すると、以下のように表示されます。
1回目の繰り返しです2回目の繰り返しです3回目の繰り返しです
このプログラムは、以下のような流れで実行されます。
count
変数を1で初期化count <= 3
という条件をチェック(最初は1 <= 3
で真)- 条件が真なので、ブロック内の処理を実行
- メッセージを表示し、
count
に1を加える(count
は2になる) - ループの先頭に戻り、再度条件をチェック(
2 <= 3
で真) - 条件が真なので、再びブロック内の処理を実行
- この繰り返しが
count
が4になり、条件が偽になるまで続く - 条件が偽になったら、ループを抜けて次の処理へ
whileループの基本的な構造は以下のとおりです。
while 条件式 # 条件式が真の間、繰り返し実行される処理end
「while」は英語で「〜の間」という意味で、「条件が真である間、処理を繰り返す」という意味になります。
カウント変数の増減
繰り返し処理をする際は、カウント変数を使って繰り返し回数を管理することが一般的です。カウント変数を増やす(インクリメントする)際には、以下のような書き方があります。
# 以下の2つは同じ意味count = count + 1count += 1 # 省略形
+=
演算子は「左辺の変数に右辺の値を加えて、その結果を左辺の変数に代入する」という意味です。この省略形を使うと、コードがより簡潔になります。
同様に、カウント変数を減らす(デクリメントする)場合は以下のように書きます。
# 以下の2つは同じ意味count = count - 1count -= 1 # 省略形
whileループの実用例
例1: 特定の回数だけ処理を繰り返す
特定の回数だけ処理を繰り返したい場合は、カウント変数を使った条件式が便利です。
# 5回繰り返すループcount = 1while count <= 5 puts "#{count}回目の処理" count += 1end
このコードは、1から5までの数字を表示します。このようなシンプルなカウントアップのループは、繰り返し処理の基本形です。
例2: ユーザーの入力を受け取るループ
whileループは、条件が満たされるまでユーザーの入力を受け付けるような処理にも使えます。
answer = nilwhile answer != "Ruby" puts "Rubyの綴りを入力してください:" answer = gets.chompendputs "正解です!"
このプログラムは、ユーザーが「Ruby」と正確に入力するまで、繰り返し入力を求めます。gets.chomp
はユーザーの入力を取得するメソッドで、入力された文字列から最後の改行文字を取り除いた値を返します。
例3: ゲームのメインループ
ゲームプログラミングでは、ゲームが終了するまでメインループを繰り返すという構造がよく使われます。
game_over = falsescore = 0
while !game_over puts "現在のスコア: #{score}" puts "1: サイコロを振る, 2: ゲーム終了" choice = gets.chomp.to_i
if choice == 1 dice = rand(1..6) # 1から6のランダムな数値 puts "サイコロの目: #{dice}" score += dice game_over = true if score >= 20 # スコアが20以上でゲーム終了 elsif choice == 2 game_over = true else puts "無効な選択です。もう一度お試しください。" endend
puts "ゲーム終了!最終スコア: #{score}"
このプログラムは、簡単なサイコロゲームを実装しています。game_over
変数がfalse
である間、ゲームのメインループが続きます。サイコロを振ってスコアが20以上になるか、ユーザーが終了を選択すると、game_over
がtrue
になりループを抜けます。
breakを使ったループの制御
whileループでは、break
文を使って途中でループを抜けることができます。これは、特定の条件が満たされたときにループを終了させたい場合に便利です。
count = 1while true puts "#{count}回目の繰り返しです" break if count >= 3 count += 1end
このプログラムを実行すると、以下のように表示されます。
1回目の繰り返しです2回目の繰り返しです3回目の繰り返しです
この例では、while true
によって無限ループを作成しています。true
は常に真なので、このループは永遠に続くことになります。しかし、break if count >= 3
という命令によって、count
が3以上になったらループを抜けるようにしています。
break
の後に条件を付ける場合は、このようにbreak if 条件式
という形で1行で書くことができます。これは、if 条件式 then break end
を簡略化した書き方です。
無限ループの注意点
無限ループ(while true
など)を使う際は、必ず適切な脱出条件(break
)を設定することが重要です。脱出条件がないと、プログラムが永遠に実行され続け、強制終了するしかなくなります。
以下は、無限ループの一般的な使い方です。
- 繰り返し条件が複雑で、ループの先頭で判断するのが難しい場合
- ユーザーが終了を選択するまで続けるインタラクティブなプログラム
- サーバープログラムのように、明示的に終了するまで動き続けるべきプログラム
無限ループを使う場合は、ループ内部で必ずbreak
を使って脱出条件を設定しましょう。
nextを使った処理のスキップ
break
がループ全体を抜けるのに対し、next
は現在の繰り返しをスキップして次の繰り返しに進むために使います。
count = 0while count < 5 count += 1 next if count == 3 # countが3のときは処理をスキップ puts "#{count}回目の処理"end
このプログラムを実行すると、以下のように表示されます。
1回目の処理2回目の処理4回目の処理5回目の処理
next if count == 3
という命令によって、count
が3のときはそれ以降の処理(puts
)をスキップして、次の繰り返しに進みます。そのため、「3回目の処理」という表示がなくなっています。
next
は、特定の条件下で処理をスキップしたい場合に便利です。例えば、配列内の特定の要素だけ処理をスキップしたい場合などに使えます。
while文とuntil文
Rubyでは、while
の他にuntil
というループ制御構文もあります。until
はwhile
の逆で、「条件が偽である間、繰り返す」という意味になります。
count = 1until count > 3 puts "#{count}回目の繰り返しです" count += 1end
このコードは先ほどのwhile
の例と同じ結果になります。until count > 3
はwhile count <= 3
と同じ意味です。
until
は、特に「〜になるまで繰り返す」という表現が自然な場合に使うと、コードが読みやすくなることがあります。どちらを使うかは、コードの読みやすさを考慮して選ぶとよいでしょう。
whileループとeachの使い分け
ここまでに学んだwhile
ループと、前回学んだeach
メソッドは、どちらも繰り返し処理を行う方法ですが、使い分けるポイントがあります。
eachが適している場面
- 配列やハッシュの全要素を処理する場合
- コレクション内の各要素に対して同じ処理を行う場合
- 繰り返し回数が事前に分かっている場合
whileが適している場面
- 繰り返し回数が事前に分からない場合
- 条件に応じて繰り返しを続けるか終了するか決める場合
- ユーザー入力などの外部要因によって繰り返しを制御する場合
- 無限ループを作成する必要がある場合
どちらの方法も基本的な繰り返し制御の仕組みですので、状況に応じて適切な方を選ぶようにしましょう。
まとめ
本章では、Rubyのwhile
ループについて学習しました。以下の内容を理解できたことと思います。
while
ループは、条件が真である間、処理を繰り返す- カウント変数を使って繰り返し回数を管理できる
break
を使って途中でループを抜けることができるwhile true
を使って無限ループを作成できるが、必ず脱出条件を設定するnext
を使って特定の繰り返しをスキップできるuntil
はwhile
の逆で、条件が偽である間、処理を繰り返す
繰り返し処理は、プログラミングにおいて非常に重要な概念です。配列の処理にはeach
メソッドが便利ですが、より汎用的な繰り返し制御が必要な場合はwhile
ループを使うことになります。状況に応じて適切な方法を選べるようになりましょう。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。