🙆
Grow.rbのmy_tally問題を解いてみる
Grow.rbとは:
Ruby力を高めたいRubyistたちが、コードを書いたりちょっとマニアックな内容を学んだりするコミュニティです。
オリジナルのmy_tally
メソッドを作ってみようというテーマです。
テストコードはこちら。
書いた回答がこちら。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