From: Christoph Date: 2003-10-24T22:26:16+09:00 Subject: Re: Struggling with variable arguments to block Gavin Sinclair wrote: ... > When I define it like this > > def sum > result = 0 > self.each { |elt| result += yield(elt) } > result > end > > {1=>2}.sum { |k,v| v } works but gives a warning. > [[1,2]].sum { |a,b| b } is fine. Actually it is the other way around - the second ``sum'' is issuing the warning and first runs perfectly okay! Here is a possible solution by distinguishing between ``normal'' enumerables and enumerables yielding possibly several values at the same time (e.g. hashes). --- module Enumerable def sum result = 0 each { |elt| result += yield(elt) } result end module Many def sum result = 0 each { |*elt| result += yield(*elt) } result end end end class Hash include Enumerable::Many end # sum of second elements h = Hash[1,2,3,4] p h.sum { |a,b| b } # 6 p h.to_a.sum {|a,b| b } # 6 --- This script should run danty without warnings. /Christoph