LoginSignup
3
3

More than 3 years have passed since last update.

Ruby ループ処理をまとめてみた

Last updated at Posted at 2021-03-31

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]
3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3