👏

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

2024/12/30に公開

Grow.rbとは:

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

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

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

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

module Enumerable
  def my_uniq
    hash = {}

    each do |el|
      key = block_given? ? yield(el) : el
      hash[key] ||= el
    end

    hash.values
  end
end
  • いかに要素の重複を排除するか、というのがポイント
  • Hashの「キーの一意性を管理する」という特性を使って、要素の重複を排除した
    • これでHashのキーは一意性が担保される
  • ||=ですでにhash[key]に値が存在していれば代入しないので、重複した値は代入されない
  • 結果的に、hash.valuesを返せば期待通りの値が返る

Discussion