Issue #14473 has been updated by al2o3cr (Matt Jones).


Minor point: IMO a "Range with steps" isn't a Range, it's something else. It doesn't seem relevant to the discussion.

Bigger point: the tests on improper ranges in the patch seem to imply some odd consequences:

~~~ ruby
range_1 = "g".."f"
range_2 = "b".."e"
range_1.subset?(range_2) # => true
range_2.any? { |el| range_1.include? el } # => false
~~~

So `range_1` claims to be a subset of `range_2`, but no elements of `range_2` are included in `range_1`.

~~~ ruby
range_3 = "d".."a"
range_1.subset?(range_3) # => true
range_3.subset?(range_1) # => true
~~~

Generally, `a <= b` and `b <= a` implies `a == b`. In this case, however, the early return in `range_subset` means that any improper range passed to `subset?` will return `true`. 

`min` and `max` also have bad performance characteristics for exclusive ranges that `linear_object_p` returns `false` for, as they need to generate all the intermediate elements using `succ`. For instance, attempting to evaluate `("aaaaaaaaaa"..."zzzzzzzzzz").max` ran for over a minute before I gave up and aborted it. There's also explicit code (see `discrete_object_p` and callsites) that makes exclusive ranges of `Time` objects raise `TypeError` if you call `max` on them.

----------------------------------------
Feature #14473: Add Range#subrange?
https://bugs.ruby-lang.org/issues/14473#change-70627

* Author: greggzst (Grzegorz Jakubiak)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Hi there,

I'd like to propose a method that returns true when a range that the method gets called on is a subrange of a range passed in as an argument.

Example:

~~~ ruby
(2..4).subrange?(1...4) 
=> true
(-2..2).subrange?(-1..3) 
=> false
~~~




---Files--------------------------------
0001-range.c-add-subset-superset-methods.patch (8.84 KB)
v2-0001-range.c-add-subset-superset-methods.patch (8.85 KB)


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