みんなのちからになりたい

コピペでブログラムつくっていきたい

case式が変数に代入できる

なにでぐぐってたのか忘れたけどこのページみてたらcase文を変数に入れてたのでびびった。
http://bojovs.github.com/2012/04/24/ruby-coding-style/

kind = case year
  when 1850..1889 then 'Blues'
  when 1890..1909 then 'Ragtime'
  else 'Jazz'
  end

やってみたらまじでできる。

[9] pry(main)> year = 1970
=> 1970
[10] pry(main)> kind = case year
[10] pry(main)* when 1850..1889 then 'Blues'
[10] pry(main)* when 1890..1909 then 'Ragtime'
[10] pry(main)* else 'Jazz'
[10] pry(main)* end
=> "Jazz"

まじかと思って調べてみたら、制御構造は式であって何らかの値を返すものがあるとか書いてあった。
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fcontrol.html

if 式は、条件が成立した節(あるいは else 節)の最後に評価し た式の結果を返します。else 節がなくいずれの条件も成り立たなけれ ば nil を返します。

[20] pry(main)> a = if 1 == 1 then true else false end
=> true
[21] pry(main)> a = if 1 == 2 then true else false end
=> false

while は nil を返します。また、引数を伴った break により while 式の戻り値をその値にすることもできます。

[33] pry(main)> i = 0
=> 0
[34] pry(main)> a = i+=1 while i < 60
=> nil

[36] pry(main)> i = 0
=> 0
[37] pry(main)> a = while i < 60
[37] pry(main)*   break 20
[37] pry(main)* end
=> 20

他にもunlessとかuntilとかforも普通に返すし、breakやnextも返す。
まじ勉強になる。