[Ruby] ループ処理のまとめ

初めに

アルゴリズムについて学習を進めていく中で、ループ処理を扱うことが多く、一度整理するためにまとめておく



本題

for

  • 配列の要素や範囲オブジェクトの範囲分同じ処理を繰り返したい時に使用する
numbers = [1,2,3]

for i in numbers
  p i
end

#=>
1
2
3


each

  • 配列、範囲オブジェクトやハッシュで使用できるメソッドで、オブジェクトに含まれる要素を順番に取得したいときに使用する
numbers = [1,2,3]

numbers.each do |num|
  p num
end

#=>
1
2
3


map(collect)

  • 配列の要素の数だけブロック内の処理を繰り返し、結果として作成された配列を返す
  • colllectはmapのエイリアス
numbers = [1,2,3]

numbers.map do |num|
  p num
end

# =>
1
2
3


※補足 eachとmapの違い

ブロック内の処理結果を返しているかどうか

each

numbers = [1,2,3]

dobule_numbers = numbers.each do |num|
  num * 2
end

p dobule_numbers

#=>
[1, 2, 3]

eachでは、ブロック内での処理結果は返されず、元の配列(numbers)の値と変わらないことがわかる


map

numbers = [1,2,3]

dobule_numbers = numbers.map do |num|
  num * 2
end

p dobule_numbers
#=>
[2, 4, 6]

mapでは、ブロック内での処理結果を返していることがわかる


while

  • 指定した条件がtrueである間ループする
  • forやeachと 違う点は、条件式がfalseになるまで、処理を繰り返し行うこと
number = 0

while number < 5 do
  p number
  number += 1
end

#=>
0
1
2
3
4


until

指定した条件がfalseの間ループする

number = 5

until number < 2 do
  p number
  number -= 1
end

#=>
5
4
3
2


loop

  • breakで終了させない限りループし続ける
  • if文と組み合わせてbreakを使用する
number = 0

loop do
  p number
  number += 1

  if number > 5
    break
  end
end
#=>
0
1
2
3
4
5


times

  • 任意の回数分だけループさせるときに使用する
  • ブロックには、[指定した回数 - 1 ]までの値が渡される
4.times do |i|
  p i
end

#=>
0
1
2
3


upto

  • レシーバーから引数で指定した値までに到達するループを行い、その間にブロックに渡される値は、1ずつ増加する
  • [ レシーバー > 引数 ]の場合、何も処理されない
1.upto(3) do |num|
  p num
end

#=>
1
2
3


downto

  • uptoと反対の挙動をとる。ブロックに渡される値は、1ずつ減少する
3.downto(1) do |num|
  p num
end

#=>
3
2
1


参考