• WebCampPro_インタビュー
    未経験から上京し、エンジニアとしてチームラボグループに転職!【WebCampPro卒業生インタビュー】
    2018.03.10
  • WebCamp_インタビュー
    「自信の持てるスキルを得たい!」内定辞退した女子大生がプログラミングを学習したワケ。
    2018.04.28
  • WebCamp_インタビュー
    時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
    2018.01.26
  • WebCamp_インタビュー
    “未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
    2017.10.04
  • WebCamp_インタビュー
    【WebCamp受講生インタビュー】起業準備中にCEOが気がついたプログラミングスキルの重要性とは?
    2017.12.25
  • WebCamp_インタビュー
    「1カ月頑張ればこの先が見えてくる」地元メディアを立ち上げたママさん
    2017.07.20
  • WebCampPro_インタビュー
    未経験でも寿司職人からWebデザイナーになった!ホスピタリティでスクールを支える宮脇トレーナー
    2017.05.26
  • WebCamp_インタビュー
    【卒業生インタビュー】台湾で月間100万UUの訪日旅行メディアを手掛けるCEOが、プログラミングを学んで得たものとは?
    2018.01.15
  • WebCampPro_インタビュー
    未経験31歳からエンジニア転職を実現【実際に聞いてみた】
    2017.04.01
  • WebCamp_インタビュー
    【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
    2018.01.15
  • WebCampPro_インタビュー
    自分で稼ぐ力をつけるため、新卒5年目の営業マンがエンジニアに転職!【WebCampPro転職者インタビュー】
    2018.02.02

◆当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

WEBCAMP【マンツーマンサポート】1ヶ月短期集中でプログラミングを学ぶスクール
1ヶ月通い放題・メンター常駐の教室環境でプログラミングを学びたい方!
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
Tech Camp教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
WEBCAMP PRO転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアへ3ヶ月で転職する為のスクールです!
12月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
11月生は満員となっております。12月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!
※プログラミングを学んでみたいけど、時間がなくて全文の記事が読めない!という方は、WebCampの無料説明会(毎日開催)に参加してみてください!

 

Ruby繰り返し処理 while

Rubyの繰り返しにはいくつかの方法があります。

そのため、同じ繰り返しでも実現する方法がいくつかあり、「動く」という意味では間違いのないプログラムをいくつも作ることができることでしょう。

しかし、プログラムというのは、それぞれのメソッドや文の適切な使いどころを把握して、よりシンプルに分かりやすく作ることが重要なのです。

ここでは、Rubyの繰り返しの1つ「while」に焦点を当てて、詳しく解説していきましょう。

whileの基本的な使い方

まずは、whileの構文から、基本的な使い方を説明していきましょう。

whileの構文は、以下のようになっています。

while 条件 do
  処理
end

whileは、条件が成立している間、処理を繰り返すものです。そして、forのように繰り返す回数を決めるオブジェクトはありません。

つまり、whileは繰り返し回数を決めることなく、条件で繰り返しを制御しているわけです。

条件

whileで設定する条件には、Rubyで条件として使えるものであれば、すべて使うことができます。

つまり、「>」や「<」、「==」などの比較演算、「and」や「or」、「not」などの論理演算、それに「True」や「False」などの真偽値も、すべてこの条件に当てはめることができるのです。

ごくごく一般的な繰り返し処理を紹介しましょう。

while01-1.rb

i = 1
while i != 10 do
  puts i
  i += 1
end

(結果)

1
2
3
4
5
6
7
8
9

最初の行で変数iが1に初期化されていますので、whileの条件である「i != 10」が成立しますので、処理が開始され、iを表示して+1していく処理が繰り返されます。そして、9を表示した後の「i += 1」でiが10になり、条件が成立しなくなりますので、繰り返しを終了するわけです。

なお、doは省略することが可能です。(以降は省略します)

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】
2018-03-22 23:28
今回の記事では、独学でPHPを1年半学習し、その後WebCampを受講して未経験からエンジニアへと転職された佐々木さんにお話を伺いました。 <プロフィール> 佐々木 祐樹 さん(2...

常に真=無限ループ

すでにお気づきの人もいると思いますが、もし条件が成立しっぱなしだった場合は、whileの繰り返しが終わることがなくなります。

一般的に「無限ループ」と呼ばれるその状態になってしまうと、PCを再起動するかCTRL+Cで強制終了するしかなくなってしまいますので、注意しなければいけません。

例えば、while01-1.rbを偶数だけ表示するようにしたいと思って、次のように変更してしまうと、簡単に無限ループに陥ってしまいます。

while01-2.rb

(*CTRL+Cが分からない方は実行しないでください)

i = 1
while i != 10
  puts i - 1  # 表示を偶数にする
  i += 2      # 偶数しか表示しないので+2
end

このように、forのように繰り返し数が明示的に決まっていないwhileは、少しの検討漏れで無限ループに陥って面倒なことになります。

そのため、whileを使用するときは停止条件(繰り返しをやめる条件=whileの条件が偽になる条件)が必ず発生することを確認しておくようにしましょう。

無限ループの必要性とbreak

上で説明したようにwhileは繰り返し回数が決まっていない状態で処理を開始し、何らかの条件で(条件が非成立になったら)繰り返しから抜ける場合に使います。

しかし、じつのところは、ほぼ無限ループになるような処理で、繰り返しを永続させる場合にも多用されています。

いま手元で動いているブラウザでも、なんでもそうですが、プログラムがある仕事を終えたとたんに終了することはないでしょう。つまり、多くのアプリケーションは、ユーザーからの明示的な終了操作がなければ永続的に動き続けているわけです。

whileは、こういったアプリケーションの動きの中心にある「ユーザーからの終了操作がない間繰り返す」動作を形作る、重要なステートメントと呼べるでしょう。

また、無限ループも絶対悪ではなく、制御できれば有用なロジックの1つなのです。

なお、アプリケーションはユーザーの終了操作がなくても終了することはありますし、別の処理へ移るためにはいったんwhileの無限ループから抜ける必要がある場合もあります。

そんなときに、「break」を使うことで繰り返しを中断して次の処理へ移ることができるわけです。

例えば、while01-2.rbをただの無限ループではなくしてみましょう。

while01-3.rb

i = 1
while i != 10
  puts i - 1  # 表示を偶数にする
  i += 2      # 偶数しか表示しないので+2
  
  break if i > 10  # 追加
end

breakをうまく使うことで、無限ループを制御することができるわけです。

ただし、これはあくまでも例です。この場合はbreakの行を追加するのではなく、whileの条件を見直すべきでしょう。

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
2018-01-26 13:03
今回の記事では、WebCampに1ヶ月間通い、未経験からエンジニアとして転職した星野さんにお話を伺いました。 <プロフィール> 星野 智洋 さん(25) 学生時代は日本大学芸術学部...

どんなときにwhile?

すでに説明している通り、whileは繰り返し回数が決まっていない繰り返し処理でその力を発揮します。

しかし、だからと言って繰り返し回数が決まっている場合に使えないわけではありません。

例えば、10回繰り返して文字列を表示するプログラムをwhileで作ってみましょう。

少し、自分で考えてみるのも良いかもしれません。

while02-1.rb

cnt = 10
while cnt > 0
  puts "Ruby"
  cnt -= 1
end

forを使えば、次のようになります。

while03-1.rb

for i in (1..10)
  puts "Ruby"
end

forの方が比較的すっきりしているように見えます。

しかし、カウントダウンしている数も併せて表示したい場合は、少し変わってきます。

while02-2.rb

cnt = 10
while cnt > 0
  puts "Ruby-" + cnt.to_s  # 修正・追加
  cnt -= 1
end

whileはすでにカウンタ変数cntが-1されていますので、cntを合わせて表示するだけです。

while03-2.rb

for i in (1..10)
  puts "Ruby-" + (11 - i).to_s  # 追加
end

もちろん、forではない方法もありますが、あくまでもforにこだわると、こうなってしまいます。

プログラム的にはwhile同様に追加しているだけのように見えますが、11というパッと見てよく分からない数字が出てきている点は、シンプルさとはかけ離れた読みにくいプログラムコードになってしまいます。

つまり、実際のプログラムをする上では、単純に「繰り返し回数が明確かどうか」だけで使い分けるのは尚早なわけです。

では、実際にはどう使い分けるべきでしょうか。

じつは、処理で扱うデータがどんなものかが、重要になってくるのです。

forが向いている繰り返し

forが扱うのに向いているデータは、簡単にまとめると次のように説明できます。

・一定の基準に従って整然と格納されているデータ

つまり、世の中に存在する多くのデータベースやリストなど、数多くのデータと呼ばれるものです。

プログラムで扱うことの多い配列やハッシュ(詳しくは「【Ruby入門説明書】配列について解説」や、「【Ruby入門説明書】ハッシュについて解説」を参照してください)なども、これに該当するでしょう。

forでは、ただ構文に当てはめるだけで配列のデータを順番に最初から最後まで取得できるわけですから、それだけで向いている処理だということを感じられると思います。

while04.rb

fruits = ["apple", "orange", "banana"]

for fr in fruits
  puts fr
end

むしろ、これらのデータを扱うためにforがあるといっても良いくらい、親和性の高いものです。

whileが向いている繰り返し

forが得意とするデータは、コンピュータが扱っている情報すべてといっても良いほどです。

そのため、whileが何のために存在するのか、少し怪しくなってきます。

しかし、whileにも得意とする処理対象はあり、それはforがあまり得意としていないもので、アプリケーションにとって非常に重要なものです。

それは、「状態」です。

コンピュータは情報処理装置ですので、データの管理や加工、計算が注目されることが多いです。しかし、じつはそれ以上に、アプリケーションにとって「状態」の管理が重要なのです。

例えば、TVの制御を考えると、電源ボタンひとつとっても、同じボタンを押す操作で、「電源OFFの状態」であれば、電源が入り、「電源ONの状態」であれば、電源が切れます。音量ボタンもUPボタンを押すことで、「いまの」音量から大きくなります。

このように、「状態」を管理することで、適切な動きをさせることができるわけです。

whileは、その「状態」を処理対象とすることに長けているわけです。

ちょっとしたゲームで、説明します。自乗計算をするゲームです。

while05.rb

corrects = 0  # 正解数を0で初期化

puts "3回正解すれば、終わります。"

# 正解数を条件にした、whileループ
while corrects < 3
  r = rand(5) + 1  # 問題となる数値をランダムに生成(1~5)

  puts r.to_s + " * " + r.to_s + "は?"

  input = gets     # キーボードからの入力待ち
  
  if input.to_i == r * r then
    corrects += 1  # 正解なので、正解数+1
  else
    puts "残念!"
  end
end

puts "おみごと!"

少し長いプログラムですが、ポイントは正解数(corrects)です。

correctsは、最初は0で、問題に正解すれば1ずつ増えていく、問題に正解した数を表しており、3になったら繰り返しを抜ける条件にもなっています。

つまり、このプログラムは、「何問正解したか」という状態によって、繰り返しの処理から抜けるかどうかを判定しているわけです。

このように、whileは決められたデータを決められた数だけ処理するのではなく、そのときの状況によって処理する回数を制御するようなプログラムに向いているわけです。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
2017-10-04 10:26
今回の記事では、未経験からWebCampを1ヶ月受講し、その後エンジニアとして転職をした喜田さんにお話を伺いました。 <プロフィール> 喜田 大介 さん (28歳) 大学時代はプ...

whileのいろいろな使い方

最後に、whileをもう少し使いこなすためのいろいろな使い方について、詳しく説明しましょう。

それぞれに適した使いどころというものがあり、プログラムの効率や読みやすさに大きく貢献します。

なにより、これらの記載方法を理解しておかなければ、Ruby中級者以上のプログラムコードを読むときに間違った理解をしてしまいますので、気を付けなければいけません。

もちろん、使っていけるほどになれば、Ruby中級者の仲間入りもそう遠くはありません。

1行で書く

whileについても、ifやforと同様に、繰り返す処理が1行だけであれば、whileも1行だけで記載することができます。

なお、この場合のwhileはwhile修飾子と呼ばれます。構文は、以下のようになっています。

処理 while 条件

条件が成立している間、処理を繰り返します。

while06.rb

cnt = 10
puts cnt -= 1 while cnt > 0

見慣れないと読みにくいと感じるかもしれませんが、単純な繰り返しを連続して並べて処理したいときなどは、while修飾子を使えば、プログラムがすっきりとします。

後置while

whileの繰り返しを作っていると、次のようなプログラムを作ってしまうことがあります。

以下のプログラムには、残念な不具合があるのですが、分かりますでしょうか?

while07-1.rb

input = 0
ans = rand(10)

while input.to_i + 5 != ans
  puts "5に足して" + ans.to_s + "になる数は?"
  input = gets
end

puts "正解!"

注目は5〜14の乱数であるansです。

乱数ですので、いくつになるか実行してみなくては分かりません。そのため、5になる場合もあるわけです。

そうなると、残念ながら、whileの処理は実行されず、急に「正解!」と表示されてプログラムが終了してしまうのです。

これは、変数inputの初期値が0になっているため、たまたまansが5だった場合、while条件が成立せず、次の処理へと移ってしまうためです。

この不具合に対応する方法はいくつかありますが、そのひとつが「後置while」です。

後置whileは、以下のような構文になっています。

begin
処理
end while 条件

後置whileは、この構文に書いてある順番通り、条件の判定を後に行います。

つまり、必ず1回処理を行って、初めて繰り返すかどうかの判断を行うのです。

そうすれば、必ず1回は問題が表示されて、答えを入力することになりますので、不自然に終了することはなくなるわけです。

while07-2.rb

ans = rand(10)

begin
  puts "5に足して" + ans.to_s + "になる数は?"
  input = gets
end while input.to_i + 5 != ans

puts "正解!"

後置whileは、このように「1度だけ処理を行ってから判定する」場合に使います。

ただし、繰り返しの処理が長くなる場合などは、繰り返しの条件が1番後ろにあるために見えにくくなってしまいます。

そのため、プログラムの見やすさの観点から、後置whileはあまり推奨されていません。

まとめ

Rubyの繰り返しのもう1つの雄「while」について、解説しました。

「while」と「for」の違いを理解することは、ただ繰り返しのやり方を理解するだけではなく、プログラムで何を管理することかを理解することになります。

ただ漫然と動くというだけではなく、実現したいことを論理的に考えてプログラムを作るようにしましょう。

・whileは繰り返し回数を決めることなく、条件で繰り返しを制御している
・無限ループは制御できれば有用なロジック
・無限ループを制御するために、breakを使う
・forはカウントダウンに弱い
・forは「一定の基準に従って整然と格納されているデータ」を処理することに向いている
・whileは、「状態」によって繰り返し処理を制限することに向いている
・後置whileは、条件の判定を後で行う

WebCampOnline プログラミングコースについて

WebCampでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

WebCampOnlineが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWebデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
2018-01-15 13:23
今回の記事では、WebCampで1ヶ月間Rubyを学習し、Webエンジニアとして転職した卒業生の田中さんにお話を伺いました。 <プロフィール> 田中 デニス 昭彦さん(...
関連キーワード
Rubyの関連記事
  • 【Ruby入門説明書】rescueについて解説
  • 【Ruby入門説明書】jsonについて解説
  • 【Ruby入門説明書】csvについて解説
  • 【Ruby入門説明書】mapについて解説
  • 【Ruby入門説明書】gemsについて解説
  • 【Ruby入門説明書】ruby sliceについて解説
おすすめの記事