😊

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

2024/12/24に公開

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]}

バリューは配列になっているのがポイント。これをどう表現するかがこの問題を解くうえで大事な点です。

テストコードはこちら。
https://github.com/grow-rb/enumerable-exercises/blob/d08568e5319c9d24a74c9cb635ed1115ad43adc3/group_by/group_by_test.rb#L1-L12

書いた回答がこちら。

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