Ruby制御構造の戻り値まとめ
Rubyの条件分岐や繰り返しの構文で何が戻り値になるのか、確認してみました。
要点をまとめると、以下のようになります。
- 条件分岐(if, unless, case)は最後に評価した値を返す。
- ただし、どの条件にも一致しない場合はnilを返す。
- 繰り返し(while, until)はnilを返す。
- ただし、breakに引数を渡すことで戻り値をその値にすることもできる。
- 繰り返し(for)はeach等のメソッドと似ていて、配列等のオブジェクトが戻り値となる。
1つずつ確認していきます。
ifは、最後に評価された値がifの戻り値となる。
irb(main):001:0> if true irb(main):002:1> "abc" irb(main):003:1> end => "abc" irb(main):004:0> if false irb(main):005:1> "abc" irb(main):006:1> else irb(main):007:1* "def" irb(main):008:1> end => "def"
戻り値を変数に代入することも可能。
irb(main):001:0> a = if true irb(main):002:1> "abc" irb(main):003:1> end => "abc" irb(main):004:0> puts a abc
unlessも同じく、最後に評価された値が戻り値となる。
irb(main):001:0> unless false irb(main):002:1> "abc" irb(main):003:1> end => "abc"
評価されなかった場合は、nilを返す。
irb(main):001:0> unless true irb(main):002:1> "abc" irb(main):003:1> end => nil
caseもifやunlessと同じく、最後に評価された値が戻り値となる。
irb(main):001:0> chr = 'b' => "b" irb(main):002:0> case chr irb(main):003:1> when 'a' irb(main):004:1> 'this is a' irb(main):005:1> when 'b' irb(main):006:1> 'this is b' irb(main):007:1> when 'c' irb(main):008:1> 'this is c' irb(main):009:1> end => "this is b"
さて、次は繰り返しです。
while、untilはnilを返す。
# while irb(main):001:0> a = 0 => 0 irb(main):002:0> while a < 5 irb(main):003:1> a += 1 irb(main):004:1> end => nil # until irb(main):001:0> a = 0 => 0 irb(main):002:0> until a > 5 irb(main):003:1> a += 1 irb(main):004:1> end => nil
breakに引数を渡して戻り値を指定することも可能。
irb(main):001:0> a = 0 => 0 irb(main):002:0> while a < 10 irb(main):003:1> a += 1 irb(main):004:1> break a if a == 5 irb(main):005:1> end => 5
forはループ対象のオブジェクトが戻り値となる。
irb(main):001:0> for i in [1,2,3] irb(main):002:1> puts i irb(main):003:1> end 1 2 3 => [1, 2, 3]