【Ruby】ループ処理の制御文について詳しく解説します

Ruby

本記事では、ループ処理の制御文について解説します。

ループ処理については以下のリンクで確認できるので、チェックしてみてください!

Rubyのループ処理の制御文とは

Rubyのプログラミング言語には、ループ、条件文、イテレータの他に、プログラム中の制御の流れを変えるための文がいくつか用意されています。

つまりこれらの文は、条件が真になるまで実行され、条件が偽になるとコードが終了するコードの一部分です。

break

Rubyでは、break文は条件が成立しループを抜けるために使われます。

break文は基本的にwhileループで使われます。なぜなら、whileループでは条件が真になるまで出力され、条件が偽になるとループが終了するからです。

break文は、ループの内部で使用されます。また、for文、case制御文でも使用できます。

n = 1

while true   
  if n * 5 >= 25
    break  
  end   
      
  puts n * 5   
  n += 1
end  

# 5
# 10
# 15
# 20

*if文で、「n * 5」が25になった時点で、break文がwhileループを終了しています。

next

Rubyでは、ループの次の処理を始めるためにnext文が使用されます。つまり、そのループはスキップされるということです。

一般に、next文はforやwhileループで使用されます。

for i in 0..5
  if i == 3 then 
    next
  end   

  puts i 
end  

# 0
# 1
# 2
# 4
# 5

*上記の例では、iが3の時にnextでループをスキップしたので、3だけ出力されませんでした。

breakとnextについては以下の記事で詳しく解説してるので、ぜひチェックしてください。

redo

redo文は、今実行しているループや処理の繰り返しを、初めから行うために使用されます

next文は常にループの終わりに制御を移し、ループの次の文が実行できるようにしますが、redo文はブロックまたはループの先頭に制御を戻し、同じ繰り返しをもう一度実行します。

i = 1

while(i < 5) 
 puts i
 i += 1

 redo if i == 5
end

# 1
# 2
# 3
# 4
# 5

*上記の例では、iが5になった時点で、redo文がもう一度 puts i を実行するようにしたので、5も出力されています。

retry

retry文は、特定の条件やメソッドの起動に基づいて、処理を最初からやり直すために使用します。

一般に、retry文が使われることはほとんどありません。Rubyのバージョン1.8までしか使えません。

Rubyバージョン1.9以降では、retry文は非推奨の言語機能として削除されました。そのため、オンラインIDEでは1.8以上のバージョンを使っていることが多いので、ほとんど動作しません。

num = 7

num.times do |num| 
 puts num 

 if num == 6
  num = num - 1 
  retry 
 end
end

# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 0
# 1
# 2
# 3
# 4
# 5

*上記の例では、numが6になった時点で-1され、retryでnum=5から num.times do |num| が再度やり直される。

return

returnは、そのメソッドの戻り値を返す役割を持っています。Rubyではわざわざreturnを定義しなくても戻り値を返してくれるので、省略されることが多いです。

しかし、returnには一つルールがあり、それはreturnを定義するとそのメソッドから抜けてしまうというものです。

def cal
   val1 = 30
   val2 = 50
return val1, val2

puts "こんにちは"
end

value = cal
puts value

# 30
# 50

*上記の例では、calメソッドを実行しても、returnがあるので puts “こんにちは” は出力されません

throw/catch

throwとcatchは、複雑な処理から大域脱出が必要な時に使用されます。

throwは、現在のループをブレークしてcatchブロックの外側に制御を転送するために使用されます。

throwの最大の特徴は、現在のループやメソッドから抜け出すことができることで、いくつものレベルを横断することができると言ってもよいでしょう。

def lessNumber(num)
    throw :numberError if num < 5
    puts "5より小さい"
end
  

catch :numberError do
    lessNumber(8)
    lessNumber(10) 

    lessNumber(2)
    lessNumber(3)
end
  
puts "catchから出ました"

# 5より小さい
# 5より小さい
# catchから出ました
タイトルとURLをコピーしました