【Ruby入門】while文の使い方を基礎の基礎から解説

while文の使い方が知りたい
while文で処理を抜ける方法が知りたい
while文で無限ループする方法が知りたい

Rubyでは繰り返しの条件が「真の間は繰り返し処理を実行する」while文があります。

今回はRubyのwhile文の基本的な使い方からら繰り返しを終了し抜ける方法など応用的な内容についても解説します。

while文の基本

while文の書き方

whileは、条件式が成り立つ間(条件式の結果がtrueになっている間)、do ~ end内の処理を繰り返し実行します。

whileの基本構文は以下の通りです。

while 条件式 do
  処理1
  処理2
  処理3
  ・・・
  ・・・
end
  • 条件式がtrueであれば、do ~ endを繰り返し処理を実行します。
  • 条件式がfalseであれば、繰り返しを抜け、終了します。

while文の使い方

では具体的なコードを見てみましょう。

cnt = 0
while cnt < 3 do
  cnt+=1
  p "counted number = " + cnt.to_s
end

[実行結果]

"counted number = 1"
"counted number = 2"
"counted number = 3"

「条件式 cnt < 3」が成り立つ間、do ~ end が繰り返し実行され、pメソッドにより、cntの値が繰り返し表示されています。

cntの値はdo ~ end中で、「cnt+=1」で1ずつ加算しています。

そして、cntが3以上までカウントアップされたら、c < 3 の条件式がfalseを返すため、whileは繰り返しの最後となり、繰り返しを終了して、do ~ endの外に抜けます。

while文の応用

break・next・redo

ここでは、whileで繰り返しを抜ける方法を紹介します。

  • 好きな回数の時に、繰り返しを終了して抜ける(break)
  • 繰り返しをスキップする(continue、next)
  • 同じ条件で繰り返しをやり直す(redo)

breakの使い方

breakは、繰り返し処理を中断し繰り返しを抜けて終了するために使用します。

以下では、cntが3の回数の時、繰り返しを抜けて中断し、終了しています。

cnt = 0
while cnt < 3 do
  cnt+=1
  break if cnt == 3
  p "counted number = " + cnt.to_s
end

[実行結果]

"counted number = 1"
"counted number = 2"

cntが3の回数の時に、ループがbreakによって中断され、whileから処理が抜けて終了しているのがわかります。

next(continue)の使い方

nextは指定の回数の時だけ繰り返しをスキップしたい時に使用します。

他の言語ではcontinueが同様の処理を行っていたりしますが、Rubyではcontinueの代わりにnextを使用します。

スキップした後は、whileの次の回から繰り返し処理が継続されます。

たとえば、cnt == 2の回数目ときだけ、pメソッドによる出力をスキップできます。

cnt = 0
while cnt < 3 do
  cnt+=1
  next if cnt == 2
  p "counted number = " + cnt.to_s
end

[実行結果]

"counted number = 1"
"counted number = 3"

cnt == 2 の回数時だけ処理がスキップされ、”counted number = 2″が表示されていませんね。

redoの使い方

redoは、同じ状態で繰り返しをもう一度行うメソッドです。nextと同じような処理ですが、

  • nextはwhileの条件式の評価からやり直す
  • redoはwhileの条件式の評価は行わず、doのところからやり直す

という違いがあります。実際にサンプルコードと[実行結果]を比較してみて、nextとの違いを確認しましょう。

cnt == 3 の回数の時に、redoしています。

cnt = 0
while cnt < 3 do
  cnt+=1
  p "counted number = " + cnt.to_s
  redo if cnt == 3
end

[実行結果]

"counted number = 1"
"counted number = 2"
"counted number = 3"
"counted number = 4"

cnt == 3 の回数の時にredoされ、whileの頭に戻りますが、条件式のところには戻らないため c < 3 の条件式は考慮されません。

redoはwhileの頭のdoのところに戻ります。そのため、 cnt == 3 と c < 3 が成り立たないにもかかわらず、doから処理が繰り返されています。

そして、cnt+=1 の箇所で、cnt == 4 となり、結果、"counted number = 4" が表示されています。

このようにredoは、whileの条件式を評価せず、頭のdoから処理を再開する動作をします。redoのこの動きは、なかなか覚えづらいですので、ここでよく把握してください。

無限ループ

whileは条件式がtrueの間、do ~ endの処理を繰り返します。

そこで、思い切って条件式にtrueを指定してみましょう。

するとwhileは無限ループします。whileの条件式が常にtrueだからです。

while true do
  print "input your words>"
  line = gets
  p "I do echo : " + line.chomp
end

[実行結果]

input your words>hello
"I do echo : hello"
input your words>hey!
"I do echo : hey!"
input your words>It's a nice day.
"I do echo : It's a nice day."
input your words>

サンプルコードの[実行結果]のように、gets と p の処理が無限に続きます。
(終了するにはCTRL+Cを入力します)

このように、whileの条件式にtrueを与えると、簡単に無限ループが実現できます。

untilとの使い分け

whileとuntilは以下のような違いがあります。

  • whileは、条件式が成り立つ間(条件式がtrueの間)、do ~ endを繰り返し実行します。
  • untilは、条件式が成り立つ前までの間(条件式がfalseの間)、do ~ endを繰り返し実行します。

untilの基本構文は、以下の通りです。

cnt = 0
until cnt == 3 do
  cnt+=1
  p "counted number = " + cnt.to_s
end

[実行結果]

"counted number = 1"
"counted number = 2"
"counted number = 3"

以上のようにuntilでは、cnt == 3 が成り立つまで、do ~ endが繰り返されていますね。

untilについては、以下の記事でも詳しく解説していますのでぜひ参考にしてくださいね!

whileでキーボード入力処理

getsは、入力がCTRL-D(ファイルの終わり。EOFの意味。)になった時に、nilを返します。

そのことを利用して、whileの条件式にline = getsを置くと、getsがnilを返した際にlineがnilになり、結果、whileの条件式の評価結果がnilとなります。

whileの条件式ではnilはfalseと等価であり、その時点でwhileの繰り返し処理が終了します。

それ以外の場合はgetsは入力された文字列を返すので、whileの条件式の評価結果はtrueとなります。

これを利用して、入力がある限り繰り返す処理を作ることができます。

cnt = 0
while line = gets do
  p "I do echo : " + line.chomp
end

[実行結果]

hello1
"I do echo : hello1"
hello2
"I do echo : hello2"
hello3
"I do echo : hello3"
how do you do?
"I do echo : how do you do?"

標準入力に関して詳しくは、以下の記事をご参照ください。

基礎からわかる!Rubyで標準入力を扱う方法(複数行、配列)
更新日 : 2019年8月2日

まとめ

今回は、Rubyのwhileによる繰り返しについて学習しました!

学習のポイントを振り返ってみましょう!

  • whileは繰り返しを行う処理
  • whileの繰り返しを抜ける方法(break)
  • whileの繰り返しをスキップする方法(next)
  • whileの繰り返しをやり直す方法には(redo)
  • whileで無限ループする方法(redo)
  • untilはwhileと逆の条件で繰り返しを行う構文
  • whileとgetsで行をlineに読み込んで入力を繰り返し続けることができる

以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

貝原 輝昌

貝原 輝昌

こんにちは!貝原(@touhicomu)と申します。
現在は、Web業界のフリーランスとして、主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務を受注しています。
現住所は、日本の西海岸、長崎県は波佐見町です。田舎ライフです。^^
地元の観光団体「笑楽井石」にボランティアでほたる撮影会やそば塾などのスタッフとして参加させて頂いています。
以下の活動も行っています。
 ・笑楽井石のブログ
 ・エクセル関数を日本語化するソフト
 ・エクセルVBAを日本語で記述するソフト

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説