Rubyのwhile文とuntil文を徹底解説!繰り返し処理の基本から可読性を高めるコツまで
生徒
「Rubyで、ある条件の間ずっと同じことを繰り返すプログラムを作りたいのですが、どうすればいいですか?」
先生
「それならwhile文やuntil文という、ループ処理を使えば解決しますよ。自動で何度も計算させたりするのに便利です。」
生徒
「whileとuntil、二つもあるんですか?どちらを使えばいいか迷いそうです。」
先生
「実は考え方が逆なだけで、使い分けを覚えるとコードがとても読みやすくなるんです。基本からゆっくり学んでいきましょう!」
1. 繰り返し処理(ループ)とは?パソコンが得意な自動作業
プログラミングにおける繰り返し処理とは、同じ命令を何度も自動で実行させる仕組みのことです。専門用語ではループとも呼びます。パソコンを触ったことがない方でも、工場のベルトコンベアを想像してみてください。製品が流れてくる間(条件)、ずっと同じ組み立て作業を続ける様子がループ処理そのものです。
もしループを使わなかったら、100回同じことをさせたいときに100行も同じコードを書かなければなりません。これは大変ですし、間違いも起きやすいですよね。Rubyのwhile文やuntil文を使えば、わずか数行で何万回もの作業を正確に指示することができるようになります。これがプログラミングの大きな魅力のひとつです。
Rubyの文法を基礎からしっかり固めたい人や、 現場で役立つ「テスト駆動開発」の考え方まで身につけたい人には、 評価の高いこの一冊がおすすめです。
プロを目指す人のためのRuby入門をAmazonで見る※ Amazon広告リンク
2. while文の基本!条件が「正しい間」はずっと実行
まずはwhile(ホワイル)文から見ていきましょう。whileは英語で「〜の間」という意味です。Rubyでは「指定した条件が正しい(真である)間、ずっと処理を繰り返す」という動きをします。
例えば、「お腹がいっぱいになるまで(満腹度が100未満の間)、ご飯を食べ続ける」というプログラムを考えてみます。処理が一周するたびに条件をチェックし、まだ条件が正しければもう一周。これを繰り返します。この「先に条件をチェックする」形を条件先行ループと呼びます。もし最初からお腹がいっぱいなら、一度もご飯を食べずに終わることもあります。
energy = 0
# energyが3より小さい間、ずっと繰り返す
while energy < 3
puts "パワーを充電中...現在のパワー:#{energy}"
# energyを1増やす(これを忘れると一生終わらない!)
energy = energy + 1
end
puts "フルパワーになりました!"
パワーを充電中...現在のパワー:0
パワーを充電中...現在のパワー:1
パワーを充電中...現在のパワー:2
フルパワーになりました!
3. until文とは?条件が「正しくなるまで」繰り返す
次に、while文の兄弟であるuntil(アンティル)文を紹介します。untilは英語で「〜まで」という意味ですね。これはwhileとは逆で、「指定した条件が正しくなるまで(偽である間)、ずっと処理を繰り返す」という動きをします。
「お腹がいっぱい(満腹度が100)になるまで食べる」という指示をしたいとき、whileだと「100未満の間」と書きますが、untilなら「100になるまで」と、より自然な言葉に近い形で書くことができます。中身の処理自体はwhileと同じですが、人間が読んだときに分かりやすい方を選ぶのがRubyらしい書き方です。無理に難しい条件式をひねり出す必要はありません。
count = 5
# countが0になるまで、ずっと繰り返す
until count == 0
puts "カウントダウン:#{count}"
# countを1ずつ減らす
count = count - 1
end
puts "発射!"
カウントダウン:5
カウントダウン:4
カウントダウン:3
カウントダウン:2
カウントダウン:1
発射!
4. doの省略と可読性!スッキリとしたコードの書き方
Rubyのwhile文やuntil文の書き方には、実は少し古いルールがあります。本来は while 条件 do という風に、条件の後に do を書くことになっていました。しかし、今のRubyでは改行さえあれば、この doを省略する のが一般的です。
なぜ省略するのかというと、その方が可読性(かどくせい)が高まるからです。可読性とは、コードの読みやすさのことです。余計な単語を削ることで、パッと見たときに「何が条件で、何が処理なのか」が目に入りやすくなります。パソコン初心者の方も、できるだけシンプルな見た目を目指すことで、自分の書いたプログラムのミスを見つけやすくなるというメリットがあります。
5. 無限ループに注意!出口のない迷路を作らないために
ループ処理を扱う上で、絶対に知っておかなければならない注意点があります。それが無限ループです。これは、ループを終わらせるための条件がいつまで経っても満たされないために、プログラムが永久に止まらなくなってしまう状態を指します。
例えば、先ほどのパワー充電の例で energy = energy + 1 という行を書き忘れたらどうなるでしょうか。パワーはずっと0のままなので、いつまでも「パワーを充電中」と表示し続け、パソコンに大きな負荷をかけてしまいます。もし間違えて無限ループを作ってしまったら、慌てずにキーボードの Ctrlキーを押しながらCキー を押して、強制的に止めましょう。初心者にとって、これは大切な護身術です。
6. 1行で書ける!後置whileと後置until
Rubyには、とても短い処理のときに使える特別な書き方があります。処理のすぐ後ろにwhileやuntilを付け足す、後置(こうち)ループという書き方です。英語の文章で「Eat bread until full.(お腹いっぱいになるまでパンを食べる)」と言うのと似たような感覚で書くことができます。
これは、繰り返したい内容がたった1行しかないときに非常に便利です。何行も使って書くよりも、1行でスッと書くことで「この処理を繰り返すだけなんだな」ということがすぐに伝わります。ただし、あまりに条件が複雑なときは、普通の書き方(ブロック形式)にした方が読みやすい場合もあります。状況に合わせて使い分けるのが上級者への第一歩です。
# 変数iを1ずつ増やしながら、5になるまで表示する
i = 1
puts "現在の数字は#{i}" ; i += 1 while i <= 3
# 上記は少し特殊な例ですが、実際は以下のように使われます
# print "入力を待っています..." until gets.chomp == "exit"
現在の数字は1
現在の数字は2
現在の数字は3
7. breakとnext!ループの動きを自由自在に操る
whileやuntilのループを回している途中で、「あ、やっぱりここで終わりたい!」とか「今の回だけ飛ばして次の回に行きたい!」ということが出てきます。そんなときに使うのが break(ブレイク) と next(ネクスト) です。
break は、条件に関わらずその場でループを完全に終了させます。一方、next は、今の回の処理だけを中断して、すぐに次の回の条件チェックへとジャンプします。これらを使いこなすことで、ただ単純に繰り返すだけではなく、より複雑で「賢い」プログラムを作ることができるようになります。例えば、名簿を順番に調べて、目的の人を見つけた瞬間に探すのをやめる、といった動作が可能になります。
num = 0
while num < 10
num += 1
# 3の倍数のときは、表示せずに次の回へ飛ばす
next if num % 3 == 0
# 8になったら、ループを完全に抜ける
break if num == 8
puts "現在の数字:#{num}"
end
現在の数字:1
現在の数字:2
現在の数字:4
現在の数字:5
現在の数字:7
8. まとめ:自分に合った繰り返しを選ぼう
ここまでRubyのwhile文とuntil文について解説してきました。どちらを使っても同じ結果を得ることは可能ですが、大切なのは「後から見たときに意味が通じやすいかどうか」です。プログラミングは書く時間よりも読む時間の方が長いと言われています。未来の自分や、一緒にコードを読む仲間のために、一番わかりやすい書き方を選ぶ習慣をつけましょう。
未経験の方は、まずwhile文から慣れていくのがおすすめです。多くのプログラミング言語で共通して使える考え方だからです。慣れてきたら、条件が否定的なときにuntilを使ってみたり、1行で書ける後置ループに挑戦してみたりして、Rubyならではの楽しさを味わってください。繰り返しの基本をマスターすれば、あなたのプログラムでできることは何倍にも広がりますよ!