😊
Grow.rbのmy_group_by問題を解いてみる
Grow.rbとは:
Ruby力を高めたいRubyistたちが、コードを書いたりちょっとマニアックな内容を学んだりするコミュニティです。
オリジナルのgroup_by
メソッドを作ってみようというテーマです。
group_by
とは:
ブロックを評価した結果をキー、対応する要素の配列を値とするハッシュを返します。
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/group_by.html)
サンプルコード
# 偶数か奇数かで分類している
> [2,3,4].group_by { |i| i.even? }
=> {true=>[2, 4], false=>[3]}
バリューは配列になっているのがポイント。これをどう表現するかがこの問題を解くうえで大事な点です。
テストコードはこちら。
書いた回答がこちら。
module Enumerable
def my_group_by
return to_enum(:my_group_by) unless block_given?
result = {} # ハッシュを初期化
each do |element|
key = yield(element)
result[key] ||= [] # ブロックの結果をKeyに代入。result[key]に値がなければ空の配列を代入する
result[key] << element
end
result
end
end
実務でEnumerable#group_by
は使う機会があまりないので勉強になった。
Discussion