Alexが言ったように、最良の方法はEnumerableに対して独自のメソッド#sumを定義することですが、各Enumerableには#eachがあるはずですが、生成される結果はサブクラスごとに異なります。たとえば、ハッシュはキーと値のペアを生成します。これは、単一の#sumメソッドが処理方法を知っている必要があります。
これがその方法の一例です。着信引数を配列にスプラットしようとし、合計には配列の最後の要素のみが含まれます。これは、ハッシュ、配列、および範囲で機能します(ただし、おそらく1.9でのみ機能します)
module Enumerable
def sum
r = 0
each {|(*x)| r += x.last}
r
end
end
または、#each_for_sumのように、Enumerableごとに独自の反復メソッドを定義し、#sumにそのメソッドを使用して合計を実行させることもできます。ただし、おそらく、異なるEnumerableに対していくつかのバージョンの#each_for_sumを作成する必要があります(たとえば、デフォルトの#each_for_sumは単にEnumerable#eachになりますが、Hash#each_for_sumは値だけを生成します)。
module Enumerable
def sum
r = 0
each_for_sum {|x| r += x}
r
end
def each_for_sum &block
each(&block)
end
end
class Hash
def each_for_sum
values.each {|x| yield x}
end
end