breakとnextでループ処理を柔軟に制御しよう

学習の目標

本章では、以下の内容を学習します。

  • breakを使ってループを途中で終了する方法を習得する
  • nextを使って特定の繰り返しをスキップする方法を理解する
  • 実践的な例を通して、breakとnextの活用場面を学ぶ
  • ループ制御の適切な使い方を身につける

はじめに

前回の章では、whileループやeachメソッドを使って繰り返し処理を行う方法を学びました。基本的なループ処理では、最初から最後まで順番に処理が実行されます。

しかし、実際のプログラミングでは、特定の条件が満たされたらループを終了したり、特定の要素だけ処理をスキップしたりする必要があることがよくあります。例えば、検索処理で目的の値が見つかったらそれ以上の検索を続ける必要がない場合や、偶数の値だけを処理して奇数はスキップしたい場合などです。

Rubyでは、このようなループの制御を行うための特別な命令としてbreaknextが用意されています。これらを使いこなすことで、より柔軟で効率的なプログラムが書けるようになります。

それでは、具体的な例を見ながら、breakとnextの使い方を詳しく学んでいきましょう。

breakでループ処理を途中で終了する

breakは、ループ処理を途中で終了させるための命令です。breakが実行されると、そのループはその時点で終了し、ループの後の処理に進みます。

実際に例を見てみましょう。

numbers = [1, 2, 3, 4, 5]
numbers.each do |number|
break if number == 3
puts number
end

このプログラムを実行すると、以下のように表示されます。

1
2

このコードでは、配列numbersの各要素に対してeachメソッドを使って繰り返し処理を行っています。処理の中でnumber == 3という条件がチェックされ、この条件が真になったとき(つまり、numberが3になったとき)にbreakが実行されます。

具体的な実行の流れは以下のようになります。

  1. 最初の要素1について、number == 3は偽なので、puts numberが実行され、1が表示される
  2. 次の要素2についても、number == 3は偽なので、puts numberが実行され、2が表示される
  3. 次の要素3について、number == 3は真になるので、breakが実行される
  4. ループが終了し、以降の要素(45)は処理されない

このように、breakを使うと特定の条件が満たされた時点でループを終了させることができます。

breakの実用例

breakは様々な場面で活用できます。以下に実用的な例をいくつか紹介します。

例1: 特定の値を検索する

配列の中から特定の値を検索し、見つかったらその時点で処理を終了する例です。

data = [12, 34, 56, 78, 90]
target = 56
found = false
data.each do |value|
if value == target
puts "#{target}が見つかりました"
found = true
break
end
end
puts "#{target}は見つかりませんでした" unless found

この例では、配列dataの中から値56を検索しています。値が見つかったら「見つかりました」というメッセージを表示し、foundフラグをtrueに設定してからbreakでループを終了します。

値が見つかったかどうかを示すfoundフラグを使うことで、ループの後で適切な処理を行うことができます。

例2: ユーザー入力を受け付けるループ

ユーザーが「quit」と入力するまで、入力を繰り返し受け付ける例です。

puts "何か入力してください(終了するには'quit'と入力):"
while true
input = gets.chomp
break if input == 'quit'
puts "あなたが入力したのは: #{input}"
end
puts "プログラムを終了します"

この例では、無限ループ(while true)を使って、ユーザーからの入力を繰り返し受け付けています。ユーザーが「quit」と入力したら、breakでループを終了し、プログラムを終了します。

このような対話型プログラムでは、ユーザーの入力に応じてループを制御するパターンがよく使われます。

nextで特定の処理をスキップする

nextは、ループの中で現在の繰り返しをスキップして、次の繰り返しに進むための命令です。nextが実行されると、その繰り返しの残りの処理はスキップされ、次の要素の処理に移ります。

実際に例を見てみましょう。

numbers = [1, 2, 3, 4, 5]
numbers.each do |number|
next if number == 3
puts number
end

このプログラムを実行すると、以下のように表示されます。

1
2
4
5

このコードでは、配列numbersの各要素に対して繰り返し処理を行っていますが、number == 3という条件が真になったとき(つまり、numberが3になったとき)にnextが実行されます。

具体的な実行の流れは以下のようになります。

  1. 最初の要素1について、number == 3は偽なので、puts numberが実行され、1が表示される
  2. 次の要素2についても、number == 3は偽なので、puts numberが実行され、2が表示される
  3. 次の要素3について、number == 3は真になるので、nextが実行され、puts numberはスキップされる
  4. 次の要素4について、number == 3は偽なので、puts numberが実行され、4が表示される
  5. 最後の要素5について、number == 3は偽なので、puts numberが実行され、5が表示される

このように、nextを使うと特定の要素の処理だけをスキップし、ループ自体は続行することができます。

nextの実用例

nextも様々な場面で活用できます。以下に実用的な例をいくつか紹介します。

例1: 条件に合う要素だけを処理する

配列の中から条件に合う要素だけを処理する例です。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
puts "偶数のみを表示します:"
numbers.each do |number|
next if number.odd? # 奇数の場合はスキップ
puts number
end

この例では、配列numbersの中から偶数だけを表示しています。number.odd?(奇数かどうかをチェックするメソッド)が真の場合はnextでスキップし、偶数の場合のみputsで表示します。

このように、nextを使うと特定の条件に合う要素だけを処理することができます。

例2: 無効なデータをスキップする

データ処理において、無効なデータをスキップする例です。

data = ["りんご", nil, "バナナ", "", "オレンジ", nil]
puts "有効な果物名:"
data.each do |fruit|
next if fruit.nil? || fruit.empty? # nilや空文字列はスキップ
puts fruit
end

この例では、配列dataの中からnilや空文字列でない有効な果物名だけを表示しています。fruit.nil?(nilかどうかをチェックするメソッド)またはfruit.empty?(空文字列かどうかをチェックするメソッド)が真の場合はnextでスキップします。

データ処理では、無効なデータや欠損値を適切に処理することが重要です。nextを使うことで、このような処理を簡潔に書くことができます。

breakとnextの使い分け

breakとnextはどちらもループ制御に使いますが、目的が異なります。使い分けのポイントを整理しておきましょう。

breakを使うべき場面

  • 目的の値が見つかったなど、処理の目的が達成された場合
  • エラーが発生し、それ以上処理を続けることができない場合
  • ユーザーが処理の終了を指示した場合

つまり、「もうこれ以上ループを続ける必要がない」という場合に使います。

nextを使うべき場面

  • 特定の要素だけを処理から除外したい場合
  • 条件に合う要素だけを処理したい場合
  • 無効なデータや例外的なケースをスキップしたい場合

つまり、「この要素は処理しないが、ループ自体は続ける」という場合に使います。

ループ制御を組み合わせた実践例

最後に、breakとnextを組み合わせた実践的な例を見てみましょう。

puts "数当てゲームを始めます!1から10の数字を当ててください"
answer = rand(1..10) # 1から10のランダムな数字
max_attempts = 3
attempts = 0
while attempts < max_attempts
print "数字を入力してください(残り#{max_attempts - attempts}回): "
input = gets.chomp
# 数字以外の入力はスキップ
unless input =~ /^\d+$/
puts "数字を入力してください"
next
end
guess = input.to_i
attempts += 1
if guess == answer
puts "正解です!答えは#{answer}でした"
break
elsif attempts >= max_attempts
puts "残念!答えは#{answer}でした"
break
else
puts guess < answer ? "もっと大きい数字です" : "もっと小さい数字です"
end
end

このプログラムは簡単な数当てゲームを実装しています。1から10までのランダムな数字を当てるゲームで、最大3回まで挑戦できます。

  • 数字以外が入力された場合は、nextでスキップして再入力を求めます
  • 正解した場合は、breakでループを終了してゲームを終了します
  • 最大試行回数に達した場合も、breakでループを終了します

このように、breakとnextを適切に組み合わせることで、より柔軟で使いやすいプログラムを作成することができます。

まとめ

本章では、Rubyのループ制御構文であるbreakとnextについて学習しました。以下の内容を理解できたことと思います。

  • breakを使うとループ処理を途中で終了させることができる
  • nextを使うと特定の繰り返しをスキップして次に進むことができる
  • breakは「ループ全体を終了させる」場合に使う
  • nextは「特定の要素だけスキップする」場合に使う
  • これらの制御構文を使いこなすことで、より柔軟なプログラムを書くことができる

ループ制御は、効率的なプログラムを書くために欠かせない技術です。条件に応じて適切にbreakやnextを使い、無駄な処理を省いたり、例外的なケースを適切に処理したりできるようになりましょう。

実際のプログラミングでは、これらの制御構文を使いこなすことで、より読みやすく効率的なコードを書くことができます。様々なケースで実践してみて、使い方を身につけていきましょう。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
whileのループ処理を学ぼう