はじめに
今回はtallyに関する内容です。Ruby3.1の新しい概念の一つにtallyメソッドがあるので簡単にまとめてみます。
確認してみた
環境はruby 3.1.4です。
こちらによると、tallyメソッドは要素ごとの個数を返すメソッドらしいです。
実際に配列に対してtallyメソッドを実行
fruits = ["banana", "pineapple", "grape", "apple", "grape", "pineapple"]
fruits.tally
すると、
irb(main):001> fruits = ["banana", "pineapple", "grape", "apple", "grape", "pineapple"]
irb(main):002> fruits.tally
=> {"banana"=>1, "pineapple"=>2, "grape"=>2, "apple"=>1}
banana/pineapple/grape/appleの個数が返っている。
tallyメソッドを使用しないパターンで同じ結果を返す方法をchatgptに聞いてみると、
fruits = ["banana", "pineapple", "grape", "apple", "grape", "pineapple"]
tally = fruits.each_with_object(Hash.new(0)) do |fruit, counts|
counts[fruit] += 1
end
puts tally
が返ってきて、実際に試すと、
irb(main):003* tally = fruits.each_with_object(Hash.new(0)) do |fruit, counts|
irb(main):004* counts[fruit] += 1
irb(main):005> end
=> {"banana"=>1, "pineapple"=>2, "grape"=>2, "apple"=>1}
irb(main):006>
irb(main):007> puts tally
{"banana"=>1, "pineapple"=>2, "grape"=>2, "apple"=>1}
tallyメソッドを使用した結果と同じ結果となりました。
おわりに
確認した結果、tallyメソッドは要素ごとの個数を返すことが分かりました。また、tallyメソッド以外の方法でtallyメソッドと同じ結果を出す方法も確認した結果、ブロック操作する必要がでてきたので、tallyメソッドを利用した方が簡単に要素ごとの個数を返すことができると感じました。もし誤っていたらご指摘いただけると助かります!
参考