From: mail@... Date: 2017-06-30T11:45:40+00:00 Subject: [ruby-core:81862] [Ruby trunk Bug#13700] Enumerable#sum may not work for Ranges subclasses due to optimization Issue #13700 has been updated by sos4nt (Stefan Sch����ler). Side note: in my opinion, `Enumerable` should not check the receiver's class to provide specific optimizations. Instead, `Range` should override `sum` and handle the optimization itself. `Range#sum` would also be a better place to document this behavior. (it still doesn't solve the subclassing issue, though) ---------------------------------------- Bug #13700: Enumerable#sum may not work for Ranges subclasses due to optimization https://bugs.ruby-lang.org/issues/13700#change-65585 * Author: sos4nt (Stefan Sch����ler) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin15] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- `Enumerable#sum` is optimized for integer ranges. Unfortunately, this can break subclasses: ```ruby class StepTwoRange < Range def each(&block) step(2, &block) end end r = StepTwoRange.new(0, 10) r.to_a #=> [0, 2, 4, 6, 8, 10] r.to_a.sum #=> 30 r.sum #=> 55 ``` The optimization should therefore only be triggered for instances of `Range` and not for instances of subclasses. (or more specifically, not for subclasses overriding `each`) If this behavior is intentional, it should at least be documented. -- https://bugs.ruby-lang.org/ Unsubscribe: