Project

General

Profile

Actions

Bug #18155

closed

(nil..nil).cover?(x) is true for all x since beginless ranges were introduced

Added by urbanautomaton (Simon Coffey) over 2 years ago. Updated almost 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
2.7.0 and greater
[ruby-core:105176]

Description

Description

The introduction of beginless ranges in #14799 changed the behaviour of Range#cover? when both the beginning and the end of a Range are nil. Previously such a range would cover no values; now it covers all values:

irb-2.6.6> (nil..nil).cover?("23 dogs")
=> false

irb-2.7.0> (nil..nil).cover?("23 dogs")
=> true

This change was noted at the time, but it was believed that the call would have previously raised an error instead of returning false. I've not exhaustively checked, but the old behaviour goes back to at least ruby 2.2.

Discussion

I'm not sure that either of these results are "correct", since I'm not sure that the concept of a range with no beginning or end is meaningful. Without either parameter, it seems impossible to infer the values it ranges over, since we have no type information available.

However, I did find both the current result and the change in behaviour quite surprising, so I've opened this issue.

Some options I considered:

  1. Do nothing: a beginless-and-endless range is unbounded in both value and type, so covers all values of all types
  2. Reinstate the old behaviour: a beginless-and-endless range has no type, so covers no values
  3. Raise an error: a beginless-and-endless range is meaningless, so constructing one should raise an error

My personal preference is option 3, but I can clearly see that it represents the most effort. I'd welcome people's thoughts; if option 1 is preferred, I'd be happy to contribute a documentation patch to make the new behaviour clear.


Files

range-18155.patch (1.08 KB) range-18155.patch eightbitraptor (Matthew Valentine-House), 10/13/2021 06:40 AM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0