8. ループ
ループ
配列、ハッシュでeach
による繰り返しはオブジェクトの要素ごとの繰り返しでした。
Rubyではその他に繰り返し処理を行うための構文があります。
条件を満たす限り繰り返したい(while)
繰り返し処理を行うための最も基本的な制御構造です。
while
文は与えられた条件式が真の間、処理を繰り返します。
条件の指定によっては無限ループとなり、処理が終了しなくなるためwhile
文を使用するときには注意が必要です。
1
2
3
while condition do # 条件式
# 処理
end
次の例は数値が10になるまで繰り返し処理を行っています。
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
1
2
3
4
5
6
2.times do
puts "大事なことなので"
end
#=>大事なことなので
#=>大事なことなので
また、each_with_index
などと同じようにインデックス情報(ループ回数)を使用したい場合は以下のように記述します。
1
2
3
4
5
6
7
2.times do |idx|
puts "大事なことなので#{idx + 1}回言いました"
end
#=>
# 大事なことなので1回言いました
# 大事なことなので2回言いました
繰り返しから抜け出したい(break)
繰り返しの条件とは別に、繰り返しから抜けるにはbreak
を使用します。主に特定の状態で処理を終了したい場合にif
文と組み合わせて使用します。
例として、以下は1から100までを順々に足していき、値が500以上になった際の数値と合計を出力するときの処理を示します。
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