Rubyのループ制御をマスター!break、next、redoの違いと使い分け完全ガイド
生徒
「Rubyで繰り返し処理を作っているのですが、途中で止めたり、特定の回だけ飛ばしたりする方法はありますか?」
先生
「ありますよ!break、next、redoという三つの命令を使えば、ループの動きを自由自在に操ることができます。」
生徒
「三つもあるんですね。それぞれどんな違いがあるんですか?」
先生
「簡単に言うと、脱出、スキップ、やり直しです。実際の例を見ながら使い分けを覚えていきましょう!」
1. ループ制御とは?繰り返し処理を賢く動かす仕組み
Rubyのプログラミングにおいて、同じ作業を何度も自動で行うことをループ(繰り返し処理)と呼びます。しかし、ただ闇雲に繰り返すだけでは不便なこともあります。例えば「名簿から特定の名前を見つけたら作業を終えたい」とか、「奇数のときだけ計算を飛ばしたい」といった細かい調整が必要になります。
このようなとき、プログラムの流れを強制的に変更する命令をループ制御と言います。これらを使いこなすことで、無駄な計算を省き、より効率的で人間にとって分かりやすいプログラムを書くことができるようになります。初心者の方でも、交通整理の信号機を操作するような感覚で学ぶことができますよ。
Rubyの文法を基礎からしっかり固めたい人や、 現場で役立つ「テスト駆動開発」の考え方まで身につけたい人には、 評価の高いこの一冊がおすすめです。
プロを目指す人のためのRuby入門をAmazonで見る※ Amazon広告リンク
2. breakの使い方!ループをその場で強制終了する
break(ブレイク)は、実行中の繰り返し処理をその場で「完全に終了」させて、ループの外に脱出するための命令です。コーヒーブレイクのように「一旦おしまい!」とするイメージですね。
例えば、1から10まで数字を数えている途中で、数字が5になったら終了したい場合に便利です。探し物が見つかったら、残りの場所を探す必要はありませんよね。そのような無駄を省くのがbreakの役割です。以下のコードで具体的な動きを見てみましょう。
[1, 2, 3, 4, 5, 6, 7].each do |num|
if num == 5
puts "5を見つけたので、ここで終了します。"
break
end
puts "現在の数字は #{num} です。"
end
現在の数字は 1 です。
現在の数字は 2 です。
現在の数字は 3 です。
現在の数字は 4 です。
5を見つけたので、ここで終了します。
3. nextの使い方!現在の回を飛ばして次へ進む
next(ネクスト)は、ループの現在の回だけを途中で切り上げて、すぐに「次の回」の処理に移るための命令です。「今回はパス!」と宣言して、次の順番の人に回すようなイメージです。
これを使うと、特定の条件に当てはまるデータだけを除外して処理を続けたいときに非常に役立ちます。例えば、名簿の中で「欠席者以外」にメールを送る、といった処理が簡単に書けます。if文の中に長い処理を書くよりも、nextを使って「条件に合わないなら次へ」と書くほうが、プログラムがスッキリして読みやすくなります。
(1..5).each do |i|
# 偶数のときだけ、後ろの処理を飛ばして次の数字へ
if i % 2 == 0
next
end
puts "#{i} は奇数なので表示します。"
end
1 は奇数なので表示します。
3 は奇数なので表示します。
5 は奇数なので表示します。
4. redoの使い方!現在の回を最初からやり直す
redo(リドゥ)は、少し特殊な命令です。現在のループの回を、条件のチェックすら飛ばして「もう一度最初からやり直す」という動きをします。nextが「次の番」へ行くのに対し、redoは「今の番をもう一回」行うわけです。
よく使われる例としては、ユーザーに入力をお願いしたけれど、入力内容が間違っていた場合に「もう一度正しく入力してください」と促す場面です。ただし、注意しないと何度も同じ場所でやり直し続けてしまう無限ループに陥る危険があるため、慎重に使う必要があります。パソコンがフリーズしたようにならないよう、使い所を見極めましょう。
count = 0
[1, 2].each do |num|
puts "現在の要素は #{num} です。"
print "この回をやり直しますか?(y/n): "
# 今回は説明のため、一回だけやり直すように条件を付けます
answer = "y" # 本来は入力を受け取る部分
if answer == "y" && count == 0
count = 1
puts "やり直します!"
redo
end
end
現在の要素は 1 です。
やり直します!
現在の要素は 1 です。
現在の要素は 2 です。
5. break、next、redoの使い分け早見表
ここで、三つの命令の違いを整理してみましょう。パソコン初心者の方でも、この表を見ればどれを使うべきか一目で分かります。迷ったときの参考にしてください。
| 命令 | イメージ | その後の動き |
|---|---|---|
| break | 脱出・終了 | ループを完全に抜けて、次のプログラムへ進む |
| next | スキップ | 今の処理を止めて、ループの「次の回」を開始する |
| redo | やり直し | 今の回を「最初からもう一度」実行する |
このように、目的によって使い分けるのがRubyマスターへの近道です。基本的には、breakとnextを使う機会が圧倒的に多く、redoは少し珍しい特別なときに使うものだと覚えておけば大丈夫です。
6. 条件式との組み合わせで安全に制御する
これらの制御命令は、単独で使うことはほとんどありません。必ず if や unless といった条件分岐とセットで使われます。「もし〜だったら、breakする」という形ですね。未経験の方は、このセットを一つの決まり文句として覚えてしまうのがおすすめです。
また、これらを組み合わせて使う際、一番大切なのは「誰が見ても分かりやすいか」という点です。あまりに複雑に組み合わせすぎると、プログラムがどこに飛んでいくのか分からなくなってしまいます。まずは一つのループに対して一つの制御命令を使うことから始めて、徐々に慣れていきましょう。安全で確実なコードを書くことが、プログラミング上達の秘訣です。
7. 複雑なループでの制御!多重ループの場合
少し難しいお話になりますが、ループの中にさらにループがある「多重ループ」の場合、breakやnextはどの範囲に効くのでしょうか?Rubyのルールでは、「一番内側のループ」に対してのみ効果を発揮します。
例えば、外側で「クラスごと」にループし、内側で「生徒ごと」にループしているときにbreakを使うと、「そのクラスの生徒の確認」は終わりますが、次のクラスの確認はそのまま続行されます。もし全体を終わらせたい場合は、もっと別の工夫が必要になります。まずは「今いる場所から一歩外に出るだけ」という感覚を大切にしてください。
8. エラーを防ぐ!制御命令を使う時の注意点
最後に、よくある間違いについて触れておきます。breakやnextを、ループではない場所(例えば単なるif文の中だけなど)で使うとエラーが発生してしまいます。これらはあくまで「繰り返し処理の中」で使うための専用コマンドだからです。
また、redoを使うときは、必ず「やり直した後に条件が変わる」ように設計してください。条件が変わらないままredoし続けると、パソコンがずっと同じ作業を繰り返してしまい、最悪の場合、画面が固まってしまいます。こうしたリスクを避けるために、初心者のうちはbreakやnextをメインに使い、redoは動作をよく理解してから挑戦することをおすすめします。
# 安全なループの例
names = ["田中", "佐藤", "鈴木"]
names.each do |name|
if name.nil?
puts "データが空なので飛ばします。"
next
end
puts "こんにちは、#{name}さん!"
end
こんにちは、田中さん!
こんにちは、佐藤さん!
こんにちは、鈴木さん!