在Ruby 2.4和Integer Ranges中,Range(Enumerable)#sum
是optimized直接返回结果,而不迭代所有元素。
我不明白为什么在enum.c
模块的Enumerable
中定义了相应的代码,而在range.c
类的Range
中没有定义相应的代码。
为什么Enumerable
应该知道包含它的类(例如Range
,Hash
,...)并检查其类型,而不是让这些类覆盖Enumerable#sum
?
见enum.c
:
return int_range_sum(beg, end, excl, memo.v);
# or
hash_sum(obj, &memo);
答案 0 :(得分:6)
因为rb_range_values
对于任意类实例(不仅是显式true
s)可能是Range
,我们都希望它们也得到优化。
基本上,这意味着只要实例响应begin
and end
(和exclude_end?
btw,),我们就会进入此优化。