[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