ばくのエンジニア日誌

技術的なメモなどを書いていきます。

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]


参考

Ruby 1.9.3 リファレンスマニュアル > 制御構造