Как сказал Алекс, лучшим способом было бы просто определить свой собственный метод #sum для Enumerable, однако, хотя каждый Enumerable должен иметь #each, то, что он дает, отличается для каждого подкласса.Например, Hash дает пару ключ-значение, с которой ваш единственный метод #sum должен знать, как справиться.
Вот один пример того, как он может это сделать, он пытается разбить входящие аргументы намассив и сумма включает в себя только последний элемент массива.Это работает для хэшей, массивов и диапазонов (однако, вероятно, работает только в 1.9)
module Enumerable
def sum
r = 0
each {|(*x)| r += x.last}
r
end
end
В качестве альтернативы вы можете определить свой собственный метод итерации для каждого перечисляемого, например #each_for_sum, и позволить #sum использовать этот метод для выполнениясуммирование.Но вам, вероятно, придется написать несколько версий #each_for_sum для разных Enumerables (например, по умолчанию #each_for_sum будет просто Enumerable # каждая, а 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