【Ruby】制御文(条件分岐と繰り返し処理)
if文(条件分岐)
条件が1個の時
文法1
if 条件式1 [then]
条件式1が真の時に実行する処理1
条件式1が真の時に実行する処理2
[else]
条件式1が偽の時に実行する処理1
条件式1が偽の時に実行する処理2
end
文法2
処理 if 条件式
条件が複数ある時
if 条件式1 [then]
条件式1が真の時に実行する処理1
条件式1が真の時に実行する処理2
[elsif 条件式2 [then]]
条件式2が真の時に実行する処理1
条件式2が真の時に実行する処理2
[else]
条件式1と2がいずれも偽の時に実行する処理1
条件式1と2がいずれも偽の時に実行する処理2
end
否定制御文(条件分岐)
文法1
unless 条件式1 [then]
条件式1が真の時に実行する処理1
[else]
条件式1が偽の時に実行する処理1
end
文法2
処理 unless 条件式
ループ文(while)
「~のあいだ」
文法1
while 条件式 [do]
条件式が真の間、実行する処理
end
i = 0
while i < 5 do
puts i
i += 1
end
文法2
処理 while 条件式
i = 0
begin
puts i
i += 1
end while i < 5
ループ文(until)
「~になるまでのあいだ」
文法1
until 条件式 [do]
処理
end
i = 0
until i > 5 do
puts i
i += 1
end
文法2
処理 until 条件式
i = 0
begin
puts i
i += 1
end until i > 5
for文
文法
for 変数 in 条件 [do]
処理
end
for は配列の各要素に対して処理を繰り返します。do は省略可能です。
for i in [1, 2, 3, 4, 5] do
puts i # 1, 2, 3, 4, 5
end
下記では、1 ~ 10 の間処理を繰り返します。
for i in 1..10 do
puts i # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
end
上記が n 以上 m 以下で動作するのに対して、
下記は n...m とすると n 以上 m 未満で動作します。
for i in 1...5 do
puts i # 1, 2, 3, 4
end
配列も条件としてできます。
for i, j in [[1, 2], [3, 4], [5, 6]] do
puts i * j # 2, 12, 30
end
※ Ruby では for 文を使用することはあまりなく、
下記のような記述をするのが一般的だそうです。
5.times do |i|
puts i
end
case文(case, when)
文法
case 変数
[when 値...値 [then]
処理]
[when 値 [then]
処理]
[else
処理]
end
case, when, else で値によって処理を振り分けることができます。
num = 4
case num
when 1..3 then
puts "1-3"
when 4 then
puts "4"
else
puts "それ以外"
end
break文
break を使うと while, until, for などのループ処理を処理の途中で抜けることができます。
for i in 1..10
if i == 5 then
break
end
puts i # 1, 2, 3, 4
end
next文
next を使うと while, until, for などのループ処理中に
next 文以降の残りの処理をスキップさせて、次のループを始めることができます。
for i in 1..10
if i == 5 then
next
end
puts i # 1, 2, 3, 4, 6, 7, 8, 9, 10
end
redo文
next がループの終了判断を行ってから処理を行うのに対して、
redo は終了判断無しで処理を繰り返します。
i = 0
while i < 5 do
i += 1
if i == 5 then
next
end
puts i # 1, 2, 3, 4
end
i = 0
while i < 5 do
i += 1
if i == 5 then
redo
end
puts i # 1, 2, 3, 4, 6
end
例外処理
文法
エラーを発生させる
raise [error_type,] message[, traceback]
文法
エラーを受け取る
begin
処理
[rescue [error_type, ...] [=> evar] [then]
エラー処理]
[else
エラー処理]
[ensure
必ず実行させたいエラー処理]
end
raise は、エラー発生時に例外(Exception)を投げます。
rescue には、例外を受け取った際の例外処理を記述します。
rescue は、Java の catch みたいな感じですかね
複数の例外を受け取りたい場合には、複数の rescue 節を記述できます。
例外種別を省略した場合、StandardError 例外とみなされます。
retry は、rescue 節で begin 式をはじめから再実行する時に使います。
else 句にはどの rescue 節にも該当しなかった例外処理を記述します。
ensure には、例外の有無に関わらず実行させたい処理を記述します。
ensure は、Java の finally みたいな感じですかね
num_attempts = 0
begin
num_attempts += 1
raise
rescue
sleep 3
puts "Retry #{num_attempts}"
retry
ensure
puts '終了'
end