本記事では、ループ処理の制御文について解説します。
ループ処理については以下のリンクで確認できるので、チェックしてみてください!
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までしか使えません。
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から出ました