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

在Ruby 2.4和Integer Ranges中, Range(Enumerable)#sum被优化为直接返回结果,而不迭代所有元素。

我不明白为什么在enum.cEnumerable模块定义了相应的代码,而在range.c没有在range.c定义。

为什么Enumerable应该知道包含它的类(例如RangeHash ,…)并检查它们的类型而不是让这些类覆盖Enumerable#sum

见于enum.c

  return int_range_sum(beg, end, excl, memo.v); # or hash_sum(obj, &memo); 

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

基本上,这意味着只要实例响应beginend (以及exclude_end? btw,),我们就会进入此优化。