プログラムの制御構造は「順次」「選択」「繰り返し」があります。これらの概念は、プログラムである限り、言語によらず必ず存在しています。もちろん、Rubyにもあります。
Rubyではさまざまな繰り返しの仕組みが用意されています。そこで本記事では、繰り返しについて徹底解説します。
for文、while文、Ruby独特のuntil文
まずはとっつきやすいように、他の言語と近い形式のfor文から解説していきます。
for文の基本
for文の基本パターンです。
for 変数 in オブジェクト do // 繰り返したい処理 end
Rubyがオブジェクトの中身を1つづつ取り出して、変数に代入して、オブジェクトの中身を全て処理するまでループを回してくれます。
このパターンにのっとり、1から10までの合計(forバージョン)を算出してみましょう。
sum = 0 for i in 1..10 do sum += i end print sum
[実行結果]
55
1から10まで足した結果が算出できました。
範囲オブジェクト
ここで1..10ってなんだろう?と思われた方も多いはずです。これは範囲オブジェクトといい、Ruby独特のものです。開始値と終了値を..で結ぶと、範囲オブジェクトとなります。Rubyでは、範囲ですらオブジェクトです。
つまり先ほどのfor文は「for i in 1..10 do」としたので、1から10までの整数を順次取り出し、iに代入して、以降に書かれた「sum += i」を実行する、ということです。
範囲オブジェクトの開始と終了は具体的な数値である必要はなく、変数でも構いません。先の例は以下のように書くことも可能です。
from = 1 to = 10 sum = 0 for i in from..to do sum += i end print sum
[実行結果]
55
ちなみに、代入部分をこのように書けます。多重代入というので、覚えておくとよいでしょう。もちろん結果は同じ55です。
(from, to, sum) = 1, 10, 0 for i in from..to do sum += i end print sum
配列をfor文で回す
オブジェクトであれば、基本的にforを回せます。次は配列をfor文を使って回してみましょう。
array = ["a", "b", "c", "d", "e"] for str in array do puts str end
[実行結果]
a b c d e
配列の中身をstrという変数で受けて、その内容をputsできました。
ループを回すうちに、条件を満たせば以降を処理せず次のループへ移したいということがあります。そんなときはnextを使います。
array = ["a", "b", "c", "d", "e"] for str in array do if str == "a" || str == "b" next end puts str end
[実行結果]
c d e
aまたはbのときはループを途中で終わらせて次のループへ回しています。よってcから表示された、というわけです。
while文
whileは、他言語の経験がある方はピンとくる書き方です。
while 条件 do // 繰り返す処理 end
この書式を使い、1から10までの合計(whileバージョン)を作りましょう。
sum = 0 i = 0 while i <= 10 do sum += i i+=1 end print sum
[実行結果]
55
whileを使い、1から10までの合計を算出することができました。
whileとfor文の使い分けはどうすればよいのでしょうか?それは以下のように考えればよいでしょう。
- 繰り返し回数が決まっておらず、条件を満たす限り回すのはwhile文。
- 回数が明確に決まっている場合はfor文。
until文
while文は、条件式を満たす間回し続けるループでした。untilはその逆で、条件を満たさない間回し続けるループです。表現を変えると、条件を満たせば終了です。終了条件を記述する、ともいえますね。
until 条件 do // 繰り返す処理 end
これを使い、1から10までの合計(untilバージョン)を作りましょう。
i = 0 sum = 0 until i > 10 do sum += i i += 1 end print sum
[実行結果]
55
untilを使ったので、「until i > 10」ということは、iが10まではループが周り、11になったとたんに条件式がtrueとなるので終了する、という動きです。
eachによる繰り返し
Rubyにはeachというメソッドがあります。これはイテレータと呼ばれるメソッドの種類の1つです。
オブジェクト.each do |変数| // 繰り返す処理 end
配列の繰り返しを、eachを使って書いてみます。
array = ["a", "b", "c", "d", "e"] array.each do |str| puts str end
[実行結果]
a b c d e
arrayの中身を1つづつ取り出してstrに代入し「puts str」を実行できました。
eachについてのもっと詳細な内容は、【Ruby入門】eachメソッドの使い方と応用例をごらんください。
timesによる繰り返し
あらかじめ繰り返す回数が決まっている場合は、timesが使えます。
繰り返す回数.times do // 繰り返す処理 end
これを使って、5回繰り返してみましょう。
5.times do puts '繰り返す処理' end
[実行結果]
繰り返す処理 繰り返す処理 繰り返す処理
putsを3回繰り返すことができました。
無限ループのloop、終わらせるbreak
loopは、無限ループ(終わらないループ)を作るときに使います。しかし終了条件を記述しないと本当に無限にループしてプログラムが終わりません。よって、loopはbreakと合わせてよく使われます。
これを使い、1から10までの合計(loopバージョン)を作りましょう。
i = 1 sum = 0 loop do sum += i i += 1 if i > 10 break end end puts sum
[実行結果]
55
loopを使い、1から10までの合計を出すことができました。loop自体は無限ループですが「if i > 10」としたので、iが11に達したときifの中身のbreakが実行されて、ループが止まるという仕掛けです。
まとめ
本記事では、繰り返しを解説しました。
繰り返しの習得は、プログラミングで避けては通れない道です。逆に繰り返しを使いこなすことができれば、とてもスマートなプログラムができます。
開始や終了の条件、繰り返すを内容を変えたりして、いろいろと遊んでみてくださいね!