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

时间:2017-01-13 14:14:38

标签: ruby enumerable

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

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

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

enum.c

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

1 个答案:

答案 0 :(得分:6)

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

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