为什么在Enumerable模块中定义了Range#sum?

Eri*_*nil 5 ruby enumerable

在Ruby 2.4和对于整数范围,Range(Enumerable)#sum优化的 直接返回一个结果,而无需遍历所有元素.

我不明白为什么enum.cEnumerable模块定义相应的代码而不是range.cRange类定义.

为什么要Enumerable知道包含它的类(例如Range,Hash...)并检查它们的类型而不是让这些类重写Enumerable#sum

enum.c:

 return int_range_sum(beg, end, excl, memo.v);
 # or
 hash_sum(obj, &memo);
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 5

因为rb_range_values可能是true任意类实例(不仅是显式Ranges),我们都希望它们也被优化.

基本上,这意味着只要实例响应两者beginend(和exclude_end?btw),我们就会进入这种优化.