Rubyのbegin-while文を完全攻略!最低1回は実行する「後判定ループ」の秘訣
生徒
「Rubyで、条件に関係なく最初の一回だけは絶対に動かしたい繰り返し処理ってどう書けばいいですか?」
先生
「それは『後判定ループ』というテクニックですね。Rubyではbeginとend whileを組み合わせて実現できます。」
生徒
「普通のwhile文だと、最初から条件に合わないと一度も動かないですもんね。具体的にはどう書くんですか?」
先生
「基本の形から、初心者でも失敗しない書き方まで詳しく説明しますね!」
1. 後判定ループとは?必ず一度は実行される仕組み
プログラミングにおけるループとは、同じ処理を何度も繰り返すことを指します。Rubyでよく使われるwhile文は、最初に「繰り返していいかな?」と条件を確認してから中身を実行します。これを「前判定ループ」と呼びます。しかし、この方法だと、最初から条件がダメな場合は一度も実行されません。
一方で、後判定ループは、まず中身の処理をやってから、最後に「もう一回やる?」と条件を確認します。この順番の違いにより、条件がどうであれ最初の一回は必ず動くという特徴があります。例えば、パスワードを入力してもらうプログラムでは、まず一度入力してもらわないと、合っているかどうかの判定ができませんよね。そういった場面でこのテクニックが活躍します。
Rubyの文法を基礎からしっかり固めたい人や、 現場で役立つ「テスト駆動開発」の考え方まで身につけたい人には、 評価の高いこの一冊がおすすめです。
プロを目指す人のためのRuby入門をAmazonで見る※ Amazon広告リンク
2. beginとend whileの基本的な書き方
Rubyで後判定ループを作るには、begin(ビギン)とend while(エンド・ホワイル)というセットを使います。beginは「ここから開始」、endは「ここで終了」という意味ですが、そのendのすぐ後ろにwhile 条件をくっつけるのがポイントです。
パソコンを触ったことがない方でも、料理の味見を想像してみてください。まず一口食べてみて(処理)、その後に「まだ味が薄いかな?(条件)」と確認しますよね。もし味が薄ければもう一度食べる、という流れです。この「まずやってみる」という姿勢がコードに現れたのがこの形なのです。以下のシンプルな例で動きを確認してみましょう。
count = 10
# 最初から条件 count < 5 に合っていないけれど...
begin
puts "現在のカウントは #{count} です。一回目なので実行されました!"
count += 1
end while count < 5
puts "ループが終了しました。"
現在のカウントは 10 です。一回目なので実行されました!
ループが終了しました。
3. ユーザー入力を受け取る実用的なプログラム
次に、より実践的な例を見てみましょう。ユーザーにキーボードから何かを入力してもらい、特定の文字が入力されるまで繰り返すプログラムです。ここでは「exit」と入力されるまで終わらないようにします。
初心者の方がパソコンでソフトを使うとき、終了ボタンを押すまで画面が消えないのと同じ仕組みです。一度は入力画面を出さなければならないので、後判定ループが最適です。Rubyではgetsという命令でキーボードの文字を読み取り、chompという命令で余計な改行を取り除きます。これらを組み合わせて、対話形式のプログラムを作ることができます。
# 入力された文字を入れる箱を用意
input_text = ""
begin
print "何か入力してください(終了するには exit と入力): "
# キーボードからの入力を受け取る
input_text = gets.chomp
puts "あなたが入力したのは: #{input_text} ですね。"
end while input_text != "exit"
puts "プログラムを終了します。お疲れ様でした!"
何か入力してください(終了するには exit と入力): こんにちは
あなたが入力したのは: こんにちは ですね。
何か入力してください(終了するには exit と入力): exit
あなたが入力したのは: exit ですね。
プログラムを終了します。お疲れ様でした!
4. 制御構造としての役割と可読性のバランス
プログラムの読みやすさのことを可読性(かどくせい)と言います。実は、このbegin...end whileという書き方は、Rubyの世界では少し特殊な扱いをされています。一見便利ですが、他の人がコードを読んだときに「あ、これは後判定だな」と気づくのが一歩遅れることがあるからです。
そのため、Rubyの公式ドキュメントなどでは、後で説明するloop doとbreakを使った書き方を推奨することもあります。しかし、初心者の方にとって「とりあえず一回動かす」という目的を最も直感的に表現できるのはこの方法です。まずはこの形をしっかり覚えて、自在に使いこなせるようになることが大切です。道具を使いこなせるようになってから、より綺麗な書き方を追求していきましょう。
5. 比較演算子を使って条件を細かく設定する
ループをいつ止めるかを決めるには、比較演算子(ひかくえんざんし)という記号を使います。例えば、==(等しい)、!=(等しくない)、<(より小さい)などです。これらを組み合わせることで、「変数が100になるまで」や「名前が空っぽでない間」といった複雑な条件を作ることができます。
パソコン初心者の方は、数学の授業を思い出すかもしれませんが、プログラミングでは「=」が二つ重なると「同じかどうか確認する」という意味になるので注意してください。後判定ループでは、この条件式が「正しい(真)」である限り、何度でもbeginの場所に戻って処理を繰り返します。条件設定を間違えると、永遠に終わらない「無限ループ」になってしまうので慎重に書きましょう。
6. beginの中で例外処理を組み合わせる
プログラミングには、予期せぬエラー(例外)が発生したときにプログラムが止まらないようにする「例外処理」という技術があります。実はbeginという言葉は、この例外処理でも中心的な役割を果たします。後判定ループを使いながら、同時にエラーにも備えることができるのです。
例えば、数字を入力してほしいのに文字が入力された場合、計算ができなくてエラーになりますよね。そんな時、beginの中でエラーをキャッチしつつ、正しい数字が入力されるまで後判定ループで何度も聞き直す、といった非常に「親切なプログラム」を作ることができます。このように、複数の機能を組み合わせることで、パソコンを触る人に優しいソフトが出来上がっていきます。
begin
print "1から10までの好きな数字を入れてね: "
number = gets.to_i # 入力を数字に変換
if number < 1 || number > 10
puts "範囲外ですよ!もう一度お願いします。"
end
# 1から10の範囲外の間は、ずっと聞き直す
end while number < 1 || number > 10
puts "ありがとうございます! #{number} を受け付けました。"
1から10までの好きな数字を入れてね: 50
範囲外ですよ!もう一度お願いします。
1から10までの好きな数字を入れてね: 7
ありがとうございます! 7 を受け付けました。
7. untilを使った後判定ループの表現
whileの反対に、until(アンティル)という言葉もあります。これは「〜まで」という意味で、条件が正しくなるまで繰り返します。end whileと同じように、end untilという形でも後判定ループを作ることができます。
「コップが満タンになるまで水を注ぐ」という指示は、untilを使うと自然ですよね。Rubyは英語に近い感覚で書けることを大切にしている言語なので、自分が作りたいプログラムのイメージに合わせて、whileかuntilか、しっくりくる方を選んでください。意味は逆になりますが、どちらも「最後に判定する」という動きは同じです。
8. 繰り返し回数を制限する安全なループ
後判定ループは便利ですが、条件を間違えると無限ループに陥る危険があります。初心者の方におすすめなのは、繰り返す回数の「最大値」を決めておくことです。たとえ条件が満たされなくても、100回繰り返したら強制的に終了する、といった安全装置を組み込むのです。
これを行うには、ループの中で回数を数える変数(カウンタと言います)を使い、if文とbreakを組み合わせます。後判定ループの柔軟さを活かしつつ、パソコンがフリーズするような事態を防ぐことができます。こうした「もしもの備え」をコードに組み込めるようになると、未経験から一歩抜け出したプログラマーらしい考え方ができるようになります。
attempt = 0
begin
attempt += 1
puts "#{attempt} 回目の挑戦です。"
# 5回やってもダメなら諦める
if attempt >= 5
puts "規定回数に達したので終了します。"
break
end
# 何らかの判定(ここでは常に繰り返す設定)
continue_loop = true
end while continue_loop
1 回目の挑戦です。
2 回目の挑戦です。
3 回目の挑戦です。
4 回目の挑戦です。
5 回目の挑戦です。
規定回数に達したので終了します。