【Ruby】制御文(条件分岐と繰り返し処理)

2015年10月5日

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

Ruby2入門

Posted by 管理人