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

に公開

Grow.rbとは:

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

オリジナルのcountメソッドを作ってみようというテーマです。
countとは、配列やハッシュに含まれる要素数を数えるメソッドです。

> [1,2,3].count
=> 3
> {a:1, b:2, c:3}.count
=> 3

テストコードはこちら。

https://github.com/grow-rb/enumerable-exercises/blob/d08568e5319c9d24a74c9cb635ed1115ad43adc3/count/count_test.rb#L1-L33

条件:size,lengthを使わないこと

書いた回答がこちら。

module Enumerable
  def my_count(arg = nil)
    count = 0

    if arg
      each do |element|
        count += 1 if element == arg
      end
    elsif block_given?
      each do |element|
        count += 1 if yield(element)
      end
    else
      each do |_element|
        count += 1
      end
    end

    count
  end
end

ChatGPT4oを使ってリファクタしたのがこちら。injectを使っている。なるほどね〜。

module Enumerable
  def my_count(arg = nil)
    if arg
      inject(0) { |count, element| count + (element == arg ? 1 : 0) }
    elsif block_given?
      inject(0) { |count, element| count + (yield(element) ? 1 : 0) }
    else
      inject(0) { |count, _| count + 1 }
    end
  end
end

Discussion