8. ループ

ループ

配列、ハッシュでeachによる繰り返しはオブジェクトの要素ごとの繰り返しでした。
Rubyではその他に繰り返し処理を行うための構文があります。

条件を満たす限り繰り返したい(while)

繰り返し処理を行うための最も基本的な制御構造です。
while文は与えられた条件式が真の間、処理を繰り返します。
条件の指定によっては無限ループとなり、処理が終了しなくなるためwhile文を使用するときには注意が必要です。

1
2
3
while condition do # 条件式
  # 処理
end

次の例は数値が10になるまで繰り返し処理を行っています。

while.rb
1
2
3
4
5
6
num = 0

while num <= 10 do
  puts num
  num += 1
end

一定の回数だけ処理を繰り返したい(times)

n回だけ繰り返し処理を行いたい場合はIntegerクラスが提供しているtimesメソッドを使用しましょう。
配列やハッシュなど対象のオブジェクトが無い場合でも繰り返し処理をすることができます。

1
2
3
num.times do # 数値.times
  # 処理
end
times.rb
1
2
3
4
5
6
2.times do
  puts "大事なことなので"
end

#=>大事なことなので
#=>大事なことなので

また、each_with_indexなどと同じようにインデックス情報(ループ回数)を使用したい場合は以下のように記述します。

times_with_index.rb
1
2
3
4
5
6
7
2.times do |idx|
  puts "大事なことなので#{idx + 1}回言いました"
end

#=>
# 大事なことなので1回言いました
# 大事なことなので2回言いました

繰り返しから抜け出したい(break)

繰り返しの条件とは別に、繰り返しから抜けるにはbreakを使用します。主に特定の状態で処理を終了したい場合にif文と組み合わせて使用します。
例として、以下は1から100までを順々に足していき、値が500以上になった際の数値と合計を出力するときの処理を示します。

break.rb
1
2
3
4
5
6
7
8
9
10
11
12
total_num = 0

(1..100).each do |num|
  total_num += num
  if total_num >= 500  # 合計値が500以上になったときに実行される
    puts num  #=>32 (条件を満たしたときの数値を出力)
    break  # 繰り返しから抜け出す
  end
end

puts total_num
#=> 528 (合計値を出力)

Note : 無限ループに陥った場合

気をつけていても無限ループを突入してしまうことがあります。
そんなときは慌てず以下のコマンドを実行してみましょう。

1
$ Control + C

コマンドラインで動作しているプログラムの大体はcontrolキーとcを同時押しすること強制終了させることが可能です。

1
2
3
4
5
[1] pry(main)> while true #無限ループ
[1] pry(main)* end
<<<<ここでControl + C>>>>
^CInterrupt: from (pry):1:in `__pry__'

ただし、処理に時間がかかっているだけで少し待てば終了するという場合もあります。
コードを論理的に追うことで無限ループかどうか判断することも重要です。
※分からない場合は先輩に聞きましょう。


演習問題

1から10までの整数をそれぞれ2乗した値を出力しましょう。

1
2
3
4
5
6
7
8
9
10
#=> 1の2乗 = 1
#=> 2の2乗 = 4
#=> 3の2乗 = 9
#=> 4の2乗 = 16
#=> 5の2乗 = 25
#=> 6の2乗 = 36
#=> 7の2乗 = 49
#=> 8の2乗 = 64
#=> 9の2乗 = 81
#=> 10の2乗 = 100