Proc
にある===
演算子をうまいこと使ってあげると面白いことが出来たので投稿します。
きっかけ
if/elsifで出来てたんだけどcaseで書き直せるのかな?と思ったので
[*1..10].each do |value|
if value.even?
p "#{value} is even."
elsif value.odd?
p "#{value} is odd."
end
end
Procでやってみた
def even_or_odd(value)
case value
# &:even? とは出来ませんでした。。
when :even?.to_proc
"#{value} is even."
when :odd?.to_proc
"#{value} is odd."
end
end
[*1..10].each do |value|
p even_or_odd(value)
end
なぜ出来るのか
Rubyではwhen
に手続きを渡すために===
を利用しています。
リファレンスをよく読んでみると、when
で手続きを渡せるように作ってるよ!とあり
先に書いたようなプログラムでも期待した動きになっています。
Rubiniusでも確かにそうなってますね!
# https://github.com/rubinius/rubinius/blob/master/core/proc.rb#L107
alias_method :===, :call