Rubyのループの処理は配列やハッシュのメソッドまで含めると多くの種類があります。
この記事では、配列やハッシュのループについて基礎的ループを8つと、発展的なループで「next」「redo」「break」などの制御構造や、配列、ハッシュのループメソッドを解説していきます。
#for
for文は基本的に指定した範囲オブジェクトの範囲分同じ処理を繰り返したり、配列の要素を順番に取得したい場合に使用します。
for number in 1..5 do
p number
end
=> [1, 2, 3, 4, 5]
また、配列の中身を順番に出力したい時は以下のように記述します。
for number in [1,3,5,9] do
p number
end
=> [1, 3, 5, 9]
#each
先ほど解説したfor文は、実は配列のループではあまり使われません。
よく使用されるのは**「eachメソッド」**です。
eachメソッドは配列や範囲オブジェクトで使用できるメソッドで、オブジェクトに含まれる要素を順番に取得することができます。
[1,3,5,9].each do |number|
p number
end
=> [1, 3, 5, 9]
{ dog:"犬", cat:"猫", monkey:"猿" }.each do |k,v|
p "#{k}はkey、#{v}はvalue"
end
=> "dogはkey、犬はvalue"
=> "catはkey、猫はvalue"
=> "monkeyはkey、猿はvalue"
#while
whileでは指定した条件式の値が真である間ループします。
for文は指定した要素分繰り返し処理を行うのに対して、while文は条件式が偽になるまで処理を繰り返し行います。
number = 0
while number <= 12 do
p number
number += 3
end
=> [0, 3, 6, 9, 12]
上記の例ようにnumberに値をループのたびに加算し、 num<=12がfalse になったときにループが終了するようにしています。
また、doは省略することも可能。
#until
untilでは指定した条件がfalseである間ループします。
whileが条件がtrueの間繰り返すのに対して、こちらはfalseの間繰り返すメソッドになります。
number = 16
until number <=12 do
p number
number -=1
end
=> [16, 15, 14, 13]
#loop
loopを使えば、breakでループを終了させない限りループし続ける処理を実装できます。
number = 0
loop do
p number
number += 3
if number >= 12
break
end
end
=> [0, 3, 6, 9]
#times
任意の回数ループさせるときに便利。指定した回数分だけループさせることができます。
3.times do |number|
p number
end
=> [0, 1, 2]
5.times do
p "ループしてます。"
end
=> ["ループしてます。","ループしてます。","ループしてます。","ループしてます。","ループしてます。"]
#upto
uptoは指定した数に到達するまでループで、その間にブロックパラメーターが1ずつ増加します。
1.upto(3) do |number|
p number
end
=> [1, 2, 3]
#downto
downtoはuptoの反対で、指定した数に到達するループ間に、変数が1ずつ減少します。
3.downto(1) do |num|
p num
end
=> [3, 2, 1]
#step
さきほど解説したtimesでは、実は任意の整数しか指定できませんでしたが、stepを使えば少数も扱えます。
3.6.step(6.0,1.2) do |number|
p number
end
=> [3.6, 4.8, 6.0]
#prime
任意の数までの素数を出力したい場合にはPrimeが便利です。
require 'prime'
Prime.each(11) do |number|
p number
end
=> [2, 3, 5, 7, 11]
#発展的なループ
##next
nextを使えば、それ以降の処理を飛ばしてループを続けられます。
[1,2,3,4].each do |number|
next if number == 1
p number
end
=> [2, 3, 4]
このように1の時はnext以降の「p number」が飛ばされて、1が出力されないことを確認できます。
##redo
redoを使えば、もう一度そのループの始め方処理を繰り返すことができます。
[0,1,2,3,4].each do |number|
number += 1
p number
redo if number == 1
end
=> [1, 2, 2, 3, 4, 5]
このように2が2回繰り返されています。
これはnum==1 のときにredoが働いてもう一度そのループを始めから読み込んだからです。
##break
breakを使えば、ループを任意のタイミングで抜け出すことができます。
[1,2,3,4].each do |number|
break if number == 3
p number
end
=> [1, 2]