更新日:
【Ruby】 while文での繰り返し処理をマスターしよう!
while文は、ある決まった処理を繰り返し行いたい時に使う制御構造です。
1
2
3
while 条件式 do
# 繰り返したい処理
end
プログラミングのコードを書いている時、この部分を繰り返し処理したいな〜と思う時があります。 そんな時に使うのが繰り返し処理です。
繰り返し処理を行うのに使う構文としてfor文、while文、until文、eachメソッドなどがあります。 while文はそのうちの一つです。
while文の基礎情報
この章では、while文の使い方や基礎情報について解説します。
while文の使い方
ではwhile文は一体どういう風に使うのでしょうか。
while文は以下のように定義します。
1
2
3
while 条件式 do
# 繰り返したい処理
end
while と do で囲まれた式が true の時だけ do と end で囲まれた処理が繰り返し実行されます。
1行だけでなく何行でも書けます。
ちなみに do は省略することもできます。
そして条件式が false になると繰り返しが止まります。
では実際にコードを書いてみましょう。
1 から 100 までの数字をターミナルに出力するコードを書きたいとします。
1
2
3
4
5
6
7
8
puts 1
puts 2
puts 3
puts 4
・
・
# 略
puts 100
こう書いても大丈夫ですが、100行書かなくてはならず非常に大変ですよね。
そんな時に繰り返し処理を使うと簡潔にコードを書くことができます。
1
2
3
4
num = 1
while num < 101 do
puts num
end
まず 1 を num という変数に代入させます。
そしてwhile文を定義し、条件式には「num < 101」という風に num が101未満、つまり100になるまで do と end で囲った puts num という処理を繰り返しなさいというコードにしているようですが、さてうまく動作するでしょうか。
実際試してみると…。
あれれ、なんかずっと1が出力され続けてしまいました。
永遠に止まる気配がないようです。
こんな時は慌てず control + c を押しましょう。
これで繰り返し処理を強制的に止めることができます。
では何で処理が止まらなかったのでしょう?
それはこのコードだと num がずっと1のままなので条件式の num < 101 がずっと true 状態だからです。
ではどうしたら処理が止まるようになるでしょう?
1
2
3
4
5
num = 1
while num < 101 do
puts num
num = num + 1
end
4行目に num = num + 1 という記述を追加してみました。
こう書くことによって繰り返処理が行われるたびに num に 1 が再代入されます。
すると1回目の繰り返しが終わった時に num = 2 になりますね。
そして再び条件判定が行われます。
この時 num = 2 なので 2 < 101 という式は true です。
コンピューターは「よし true だからもう1回 do と end に書いてある処理を実行しよう」となり、
再び puts num と num = num + 1 というコードが実行されます。
ここで num は再び1が足されますので num = 3 になりますね。
そしてまた条件判定が行われます。
num = 3 なので 3 < 101 は true。
なので再び繰り返し処理が行われます。
100回目の繰り返し時に num は 101 になります。
条件判定の時に 101 < 101 という式は間違ってます。
なので false が返るためコンピューターは「条件式が false だから do と end の中のコードは実行せず、ここでやめよう」と判断し、繰り返し処理が止まります。
実際の挙動をみてみましょう。
しっかりと 1 から 100 までの数字が出力されましたね。
このようにwhile文を使うと非常に効率よくコードを書くことができます。
こちらの参考書では、while文やRubyについて理解を深めることができます。
while文を意図的に止める方法
このようにwhile文は条件式が false になると繰り返し処理が止まります。
ですがコード内に break が記述されているとそのあとにコードが書かれていても繰り返しから抜けることができます。
先ほどのコードに break を追加してみましょう。
break でコードが止まるか確認するためそのあとに puts num 追加してみます。
1
2
3
4
5
6
7
num = 1
while num < 101 do
puts num
num = num + 1
break
puts num
end
では実行してみましょう。
このように1回しか実行されず、 break の後の puts num も実行されていないのが確認できます。
break は何かしらの条件に当てはまった時に break が実行されてループ処理を終了させるといった場面で使用することが多いです。
例として200未満になったら止まるようなコードを書きました。
ですが下のように break を記述するとnum が101になった時点で break で繰り返し処理を抜け出すことができます。
結果として1 から 100 までの数字が出力されます。
1
2
3
4
5
6
7
8
num = 1
while num < 200 do
puts num
num = num + 1
if num == 101
break
end
end
では実行してみましょう。
条件式に直接 true と書いておけば break という記述があるまで無限にループさせることができます。
上のようにある条件になった時にだけ break を発動させ、ループを解除させるという方法がよく使われます。
その他の繰り返し処理文
while文の他にもRubyには繰り返しができる文があります。
いくつか紹介しておきましょう。
until文
while文は条件式がtrueの時だけ繰り返したのに対し、until文は条件式がfalseの時に繰り返します。
書き方は下記の通りです。
1
2
3
until 条件式 do
繰り返したい処理
end
while文では 1 から 100 までの数字を順に出力させましたが、今度は 100 から 1までをカウントダウンで出力するコードをuntil文を使って書いてみましょう。
1
2
3
4
5
num = 100
until num <= 0 do
puts num
num = num - 1
end
実際に実行してみます。
このように 100 から 1 が順に出力されました。
while文と違い、num < 0 としてしまうと 0 < 0 は flase なので0も出力されてしまいます。
ですので num <= 0 とすることにより num が 0 以下になった時と指定しました。
while文よりちょっと使いづらい印象ですね。
このようにuntil文はwhile文とは正反対のことを繰り返して実行することができます。
for文
for文は指定したオブジェクトから順に値を取り出しながら do と end の間に書いたコードを繰り返したい時に使います。
書き方は以下のように定義します。
while文と同じようにdoは省略が可能です。
1
2
3
for 変数 in オブジェクト do
繰り返したい処理
end
オブジェクトには配列やハッシュが入ります。
1
2
3
4
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for num in nums
puts num
end
実行してみましょう。
このように nums の中に入っているオブジェクトが1個ずつ順に取り出され、numという変数に入り puts num で出力されているのが確認できます。
上のwhile文でやった 1 から 100 まで出力するコードはfor文を使うと下記のようにも書けますね。
1
2
3
for num in 1..100 do
puts num
end
while文を使った時よりさらに短いコードで書けました。
上のコード内で使われている「..」は範囲オブジェクトです。
範囲オブジェクトは左辺に最初の値を指定し右辺に最後の値を指定します。
数字や文字列を指定することができ、それぞれ順番に値を取得することができます。
alphabets = "a".."z"
とすると a から z までのアルファベットが順にalphabetsに代入されます。
for文で出力して確認してみましょう。
このように a から z までが順番に出力されました。
ハッシュを取り出す時には下記のように記述します。
1
2
3
4
programan = {name: "プログラマン", height: 170, gender: "man"}
for key, value in programan
puts "#{key}は#{value}です。"
end
実行してみます。
このようにfor文は配列やハッシュなどから順番に1つず取り出し、変数に入れてそれを繰り返し実行するときに使います。
繰り返し構文はこのようなものがありますが、eachメソッドを使い、繰り返し処理を行うこともできます。
この記事のまとめ
- while文は、ある決まった処理を繰り返し行いたい時に使う制御構造のこと
while
とdo
で囲まれた式がtrueの時だけdo
とend
で囲まれた処理が繰り返し実行されるbreak
を記述すると、繰り返し処理から抜けることが出来る