ヽ(´・肉・`)ノログ

How do we fighting without fighting?

Ruby2.2に入るObject#itselfの使いどころ

2.2 からは Object#itself というメソッドが使えるようになる

2 年くらい前の提案が議論されて取り込まれたようだ.これがあるとどう嬉しいのか.

例えば,重複した値のある配列に対して,重複した個数を求めたいとする.

従来はこのようにして求めていた.

array = %i(a f b f c c b d b)
array.group_by { |e| e }.map { |k,v| [k, v.count] }
=> [[:a, 1], [:f, 2], [:b, 3], [:c, 2], [:d, 1]]

ところで,以下の 2 つの式は同じことをしている.

詳しく知りたければ Symbol#to_proc について調べるといくつも解説がある.(例 : Symbol#to_proc でワンコールブロックを簡潔に書こう )

[1, 2, 3, 4].select { |e| e.odd? }
[1, 2, 3, 4].select(&:odd?)

個人的には後者の方が好きなので,

array.group_by { |e| e }

array.group_by(&:self)

のように書けるとうれしい.

しかし残念なことに self はメソッドではなく,疑似変数と呼ばれているものなので,この方法が使えない.

itself はメソッドなので, &:itself と書ける.つまり以下のような書き方ができる.

array = %i(a f b f c c b d b)
array.group_by(&:itself).map { |k,v| [k, v.count] }
=> [[:a, 1], [:f, 2], [:b, 3], [:c, 2], [:d, 1]]

うれしい.