正如亚历克斯所说,最好的方法是为 Enumerable 定义自己的方法#sum,但是,虽然每个 Enumerable 都应该有#each,但每个子类产生的结果是不同的。例如 Hash 产生一个键值对,您的单个 #sum 方法必须知道如何处理。
这是它如何做到这一点的一个示例,它尝试将传入的参数放入一个数组中,并且总和仅包括数组的最后一个元素。这适用于哈希、数组和范围(但它可能只适用于 1.9)
module Enumerable
def sum
r = 0
each {|(*x)| r += x.last}
r
end
end
或者,您可以为每个 Enumerable 定义自己的迭代方法,例如 #each_for_sum 并让 #sum 使用该方法进行求和。但是您可能必须为不同的 Enumerables 编写多个版本的#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