【Ruby】ループ

whileは、条件が真である限り本体を繰り返し実行します。

cnt1 = 1
while cnt1 <= 10
  print cnt1, " "
  cnt1 += 1
end

カウンタ用変数を1で初期化し、カウンタが10以下の間、カウンタ値を出力してカウントアップします。

上記プログラムの実行結果は以下のようになります。

1 2 3 4 5 6 7 8 9 10 

untilは、条件が真になるまで本体を繰り返し実行します。

cnt2 = 1
until cnt2 > 10
  print cnt2, " "
  cnt2 += 1
end

whileとuntilは、ifやunlessのように文の最後に記述して修飾することができます。

cnt3 = 0
# 文の最後に条件を添える
print cnt3 += 1, " " while cnt3 < 10

上記プログラムの実行結果は以下のようになります。

1 2 3 4 5 6 7 8 9 10 

複数の文をbegin/endブロックでまとめることができますが、begin/endブロックの最後に修飾した場合はブロック内が最低1回は実行されます。

cnt4 = 1
# begin/endブロックの最後に条件を添える
begin
  print cnt4, " "
  cnt4 += 1
end while cnt4 <= 1

上記プログラムの実行結果は以下のようになります。

1 

「for 変数 in オブジェクト」で、オブジェクトの要素を1つずつ取り出して変数で参照できるようにし、すべての要素に対して後に続く文を実行します。

for cnt in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  print cnt, " "
end

角括弧で囲まれていて、要素がカンマで区切って列挙されているのは配列です。

上記プログラムの実行結果は以下のようになります。

1 2 3 4 5 6 7 8 9 10 

loopはブロック(コードを{と}で囲んだもの、あるいはdoとendで囲んだもの)を永久に繰り返します。
ループ制御文を使うとwhile、until、loopのフローを制御することができます。
breakはループから脱出します。nextはループの終わりにジャンプして次のループに入ります。redoはループをやり直します。

loop、next、breakの例です。

cnt5 = 0
loop {
  cnt5 += 1
  # 偶数だったらスキップ
  next if cnt5 % 2 == 0
  # 10を超えたらループを抜ける
  break if cnt5 > 10
  print cnt5, " "
}

上記プログラムの実行結果は以下のようになります。

1 3 5 7 9 

loopはイテレータです。イテレータとは、配列などのコレクションから連続する要素を返すメソッドのことを言います。
イテレータにはいくつかありますが、その中のtimesメソッド、uptoメソッド、eachメソッドの例を見てみます。

# 3回ループする
3.times do
  puts "Hello"
end
# 1から10まで1ずつカウントアップしてループする
1.upto(10) do |cnt|
  print cnt, " "
end
puts
# 配列の要素数分ループする
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].each do |cnt|
  print cnt, " "
end

doの後の、|で囲まれているものはメソッドから渡されるパラメータを受け取る変数です。メソッドによっては複数のパラメータを渡してくるものもありますが、その場合は複数の変数をカンマ区切りで記述します。

上記プログラムの実行結果は以下のようになります。

Hello
Hello
Hello
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10