Issue #12090 has been updated by Stefan Schler.


Raising an error would break backward compatibility. Maybe `cover?` should just return `nil` to indicate incomparable values.

    ("a".."z").cover?("c")  # => true
    ("a".."z").cover?("5")  # => false
    ("a".."z").cover?(1)    # => nil

----------------------------------------
Bug #12090: `Range#cover` does not raise an exception when comparison fails
https://bugs.ruby-lang.org/issues/12090#change-57060

* Author: Tsuyoshi Sawada
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: 
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
The documentation for `Range#cover?` says,

~~~
cover?(obj) вк true or false

Returns true if obj is between the begin and end of the range.

This tests begin <= obj <= end when exclude_end? is false and begin <= obj < end when exclude_end? is true.
~~~

which implies that, when comparison fails, `cover?` should raise an error. But actually, it doesn't:

~~~RUBY
"a" <= 1 # => ArgumentError: comparison of String with 1 failed
1 <= "a" # => ArgumentError: comparison of Fixnum with String failed
("a".."z").cover?(1) # => false
~~~
It silently returns `false` instead of raising an error.

Either `Range#cover?` should raise an error when comparison fails, or the documentation should be changed to correctly describe this behaviour.




-- 
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>