📌
Grow.rbのmy_sum問題を解いてみる
Grow.rbとは:
Ruby力を高めたいRubyistたちが、コードを書いたりちょっとマニアックな内容を学んだりするコミュニティです。
オリジナルのmy_sumメソッドを作ってみようというテーマです。
テストコードはこちら。
書いた回答がこちら。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