2023-07-31 Ruby case文
Ruby case文がどう内部的に解釈されているか。
case 式0
when 式1, 式2
stmt1
when 式3, 式4
stmt2
else
stmt3
end
このようなcase文があったとき、Rubyは以下のように解釈する。
_tmp = 式0
if 式1 === _tmp or 式2 === _tmp
stmt1
elsif 式3 === _tmp or 式4 === _tmp
stmt2
else
stmt3
end
また
===
がどのような条件で真になるかは、各クラスの===
メソッドの動作についてのドキュメントを参照して下さい。
case文の例
下記記事よりいくつかのcase文の例を抜粋。
Understanding Ruby - Triple Equals - DEV Community
case 1990
when ..1899 then :too_early
when 1900..1924 then :gi
when 1925..1945 then :silent
when 1946..1964 then :baby_boomers
when 1965..1979 then :generation_x
when 1980..2000 then :millenials
when 2000..2010 then :generation_z
when 2010.. then :generation_alpha
else
:who_knows
end
# => :millenials
case 'foobar'
when String, Integer then :one
when Float, NilClass then :two
else
:three
end
# => :one
divisible_by = -> divisor { -> n { n % divisor == 0 } }
(1..15).map do |n|
case n
when divisible_by[15] then :fizzbuzz
when divisible_by[5] then :buzz
when divisible_by[3] then :fizz
else
n
end
end
# => [
# 1, 2, :fizz, 4, :buzz, :fizz, 7, 8, :fizz, :buzz,
# 11, :fizz, 13, 14, :fizzbuzz
# ]
case [0, 1]
in [..10, ..10] then :close_to_base
in [..100, ..100] then :venturing_out
in [..1000, ..1000] then :pretty_far_out
else :way_out_there
end
# => :close_to_base