From: muraken@... Date: 2017-10-24T17:03:58+00:00 Subject: [ruby-core:83546] [Ruby trunk Bug#14048] Enumerable#sum sometimes assumes objects are `Range`s when they're not Issue #14048 has been updated by mrkn (Kenta Murata). Assignee set to mrkn (Kenta Murata) ---------------------------------------- Bug #14048: Enumerable#sum sometimes assumes objects are `Range`s when they're not https://bugs.ruby-lang.org/issues/14048#change-67571 * Author: rohitpaulk (Paul Kuruvilla) * Status: Open * Priority: Normal * Assignee: mrkn (Kenta Murata) * Target version: * ruby -v: ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- If a class defines the methods `begin` and `end`, Enumerable assumes that it is a `Range` object and tries to access the `exclude_end?` method. ~~~ruby class NotARange include Enumerable # Defines the `#sum` method def each yield 2 yield 4 yield 6 end def begin; end def end; end end not_a_range = NotARange.new puts not_a_range.sum ~~~ The above program throws an error: ~~~ main.rb:20:in `sum': undefined method `exclude_end?' for # (NoMethodError) ~~~ If either `begin` or `end` are not defined though, it works fine and returns `12`. It looks like the commit that introduced this was: https://github.com/ruby/ruby/commit/53b4c2b87a9c6832e663cf5773a8aca9a1cf3341 I think that `Enumerable` should only attempt to perform the optimization on objects that are indeed `Range` or subclasses of `Range`. -- https://bugs.ruby-lang.org/ Unsubscribe: