📌

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

に公開

Grow.rbとは:

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

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

テストコードはこちら。

https://github.com/grow-rb/enumerable-exercises/blob/d08568e5319c9d24a74c9cb635ed1115ad43adc3/sum/sum_test.rb#L1-L28

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

module Enumerable
  def my_sum(obj = 0)
    result = obj

    each do |el|
      raise TypeError unless el.is_a?(Numeric) || el.is_a?(String) || el.respond_to?(:to_a)

      result += block_given? ? yield(el) : el
    end
    result
  end
end
  • 引数の初期値として数値(0)を持たせておいて、別のオブジェクトが渡されたらそれをresultへ代入しておく
    • メソッドの返り値として基本は数値が返るようにして、引数に文字列や配列オブジェクトがきたときにはそのオブジェクトを返すという意図
  • 例外処理のところはもうちょっと上手く書けそうだが…
  • ブロックが渡されていればyieldして加算、そうでないならレシーバの要素を加算していく
  • my_XXシリーズでは一貫してyieldを使っているけど、実務で書くならちゃんと引数で明示的に&blockを受け取ってcallしたほうがいいかな

Discussion