在Ruby 2.4和对于整数范围,Range(Enumerable)#sum在优化的 直接返回一个结果,而无需遍历所有元素.
我不明白为什么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);
Run Code Online (Sandbox Code Playgroud)
因为rb_range_values可能是true任意类实例(不仅是显式Ranges),我们都希望它们也被优化.
基本上,这意味着只要实例响应两者begin和end(和exclude_end?btw),我们就会进入这种优化.