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