【Ruby】2.7 から追加された Enumerable#tally メソッドが便利
2021/08/07
Ruby 2.7から追加された Enumerable#tally メソッドが便利なので、必要になったときにすぐ使えるようにメモしておく
Enumerable#tally
tally メソッドは配列内の同じ要素の数を数えてHashで返してくれるメソッド
[1,2,2,2,3,3,4,5].tally
#=> {1=>1, 2=>3, 3=>2, 4=>1, 5=>1}
今までやり方
2.7 以前では以下のようなやり方でやるしかなかった
[1,2,2,2,3,3,4,5].group_by(&:itself).transform_values(&:size)
#=> {1=>1, 2=>3, 3=>2, 4=>1, 5=>1}
他にもやり方は存在するが、どれも1メソッドで完結できない
Enumerable#tally_by
tally_by は残念ながら存在しない
存在したら単語の頭文字で集計などに使える
['Apple', 'Box', 'Cat', 'Ball', 'Cup'].tally_by { |s| s[0] }
#=> {"A"=>1, "B"=>2, "C"=>2}
代替
map 経由なら実現できる
['Apple', 'Box', 'Cat', 'Ball', 'Cup'].map { |s| s[0] }.tally
#=> {"A"=>1, "B"=>2, "C"=>2}
一応、採用するかどうかは議論中みたい
https://bugs.ruby-lang.org/issues/11076#note-22