🙆

Grow.rbのmy_tally問題を解いてみる

2024/12/29に公開

Grow.rbとは:

Ruby力を高めたいRubyistたちが、コードを書いたりちょっとマニアックな内容を学んだりするコミュニティです。

オリジナルのmy_tallyメソッドを作ってみようというテーマです。

テストコードはこちら。

https://github.com/grow-rb/enumerable-exercises/blob/master/tally/tally_test.rb#L1-L8

書いた回答がこちら。eachのみを使う縛り。

module Enumerable
  def my_tally
    hash = {}

    each do |el|
      if hash.key?(el)
        hash[el] += 1
      else
        hash[el] = 1
      end
    end

    hash
  end
end

もっと短くすると

module Enumerable
  def my_tally
    hash = Hash.new(0)
    each { |el| hash[el] += 1 }
    hash
  end
end
  • Hash.new(0)で初期値を設定していることで、hash[el]は0を返すため、その後の+=でエラーにならない
  • Rubyのハッシュはキーを一意に管理するため、同じキーに値を代入すると、以前の値が上書きされる
    • 一個目のコードのようなhash.key?(el)は必要ないということ

ちなみに、2024年のクリスマスにリリースされたRuby 3.4系の新機能ではこのようにも書ける😄

module Enumerable
  def my_tally
    hash = Hash.new(0)
    each { hash[it] += 1 } # itが使える!
    hash
  end
end
``

Discussion