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 #<NotARange:0x00007f8750950c70> (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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>