はじめに

条件判定文はうまく書けるようになりましたか?
条件判定文は、条件分岐だけでなく繰り返し(ループ)にも使われます。
繰り返しも制御構造のひとつであり、まったく同じ処理(またはすこし異なる処理)を繰り返し実行します。
ループを使えば、同じ処理を何度も記述する必要がなく、コードの重複を避けられます。
この記事では、Ruby初心者の方向けに、制御構造のひとつである繰り返し(ループ)について説明していきます。
条件分岐同様、複数の構文があります。

繰り返しとはなにか?

繰り返し(ループ)とは、まったく同じ(またはやや異なる)処理を繰り返し実行することです。
たとえば、ユーザーからの入力を繰り返し受け付けたり、ファイルの終わりまで読み込んだりするなどです。
また、配列をはじめとするコレクションの要素に対して、くり返し同じ処理を実行することもあります。
まずは、while文を使った繰り返しについてみていきましょう。

while文での繰り返し

while文は、多くの言語に存在する基本的な制御構造です。さっそくコードをみてみましょう。
例:

num = 5
while num < 1000
num *= 2
puts num
end

この例では、変数numが1000を超えるまで2倍しています。
while文は、条件判定文が真の(成り立っている)間だけ処理を継続します。
最終的に、変数numが1280となった時点で条件判定文が偽となるため、そこでループが終了します。
逆にいえば、条件が偽にならない限りループは終了しませんので、無限ループにならないように条件に注意しましょう。
一般的に、while文の内部で条件となる変数を更新することが多いです。
条件判定は各ループの開始前に行われるため、条件によってはwhile文が一度も実行されないこともあることに注意しましょう。
次は、while文と対をなすuntil文です。

until文での繰り返し

until文は、while文と逆の性質を持っています。
つまり、条件判定文が偽の(成り立っていない)間だけループを継続します。
次の例をみて下さい。
例:

num = 1000
until num < 1
num /= 2
puts num
end

この例では、変数numが1より小さくなるまで2分の1にしています。
while文とは条件の意味が逆になっていることに注目して下さい。
基本的にはwhile文を使えば問題ありませんが、until文のほうが条件がわかりやすくなる場合は使ってみましょう。
次は、ブロック構文による繰り返しです。

ブロック構文を使った繰り返し

最後に、ブロック構文を使った繰り返しを学んでいきましょう。
ブロック構文とは、コードの塊(コードブロック)をメソッドに渡す方法のひとつです。まずは、例をみてみましょう。
例:

nums = [1, 2, 3, 4, 5]
nums.each { |n| puts n * 2 }

プログラムでは、配列などのコレクションの要素に対して、順次処理を実行したいことがよくあります。
そのため、配列には「eachメソッド」が用意されています。
”eachメソッド”にはコードブロックを渡します。
コードブロックには配列の要素が順次渡され、要素の数だけループ処理されます。
この例では、配列の要素を2倍してひとつずつ出力しています。
また、ブロック構文はもうひとつの書き方があり、次のようにすることもできます。
例:

nums = [1, 2, 3, 4, 5]
total = 0
nums.each do |n|
total += n
puts total
end

この例では、配列の要素を順次足し合わせて、合計値を出力しています。
先ほどの構文でも複数行のコードブロックが書けますが、一般的にはこちらの構文が好まれるでしょう。
結果的にはどちらも同じです。
コードブロックが単一行か複数行かで使い分けるとよいでしょう。
なお、コードブロック中の変数(||で囲われた部分)には任意の名前をつけることができます。

まとめ

3種類の繰り返し構文は理解できましたか?
while文やuntil文も重要ですが、最も使用頻度が高いのはブロック構文を使った繰り返しでしょう。
なぜなら、意味的な繰り返しよりも配列などのコレクションの要素をループ処理することが多いからです。
しっかりマスターしておきましょう。