0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby|caseでいろいろやってみた

Posted at

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?