Issue #12133 has been updated by Ryan Hosford.


Yui NARUSE wrote:
>
> On such case, an implementation will be something like following.
> If you want more easy to read one, which declares inclusive-or-exclusive range and validates there's no duplication,
> it seems something different one from current simple range object, but more complex one.
> 
> ```ruby
> case ARGV.shift.to_r
> when 0..20.1.to_r
>   puts "low"
> when 20.1.to_r...23.4.to_r
>   puts "middle"
> when 23.4.to_r..99
>   puts "high"
> end
> ```

Here you've used the case statement to exclude start on the middle range. The problem is the code is largely static while the values of the endpoints (and which ranges should include those endpoints) may change. Physicians may all agree that 20.1 is in a low range today, but tomorrow?

I think this workaround could be made to work ( if 'middle' range is exclude start, 'low' needs `#..`; if 'middle' range is not exclude start, 'low' needs `#...`) but it would be tricky, unintuitive, complicated, etc..

----------------------------------------
Feature #12133: Ability to exclude start when defining a range
https://bugs.ruby-lang.org/issues/12133#change-57720

* Author: Ryan Hosford
* Status: Feedback
* Priority: Normal
* Assignee: 
----------------------------------------
An intuitive, approach would be to allow defining ranges like so:

~~~
[1..10]
[1..10)
(1..10]
(1..10)
~~~

... where a square bracket indicates boundary inclusion and a parenthesis represents boundary exclusion. The syntax there is obviously not going to work, but it demonstrates the idea.

A more feasible, still intuitive, solution might look like the following

~~~
(1..10)                # [1..10]
(1...10)               # [1..10) ... Alternatively: (1..10).exclude_end
(1..10).exclude_start  # (1..10]
(1...10).exclude_start # (1..10) ... Alternatively: (1..10).exclude_start.exclude_end
~~~

For consistency, I think we'd also want to add `#exclude_start?` & `#exclude_end` methods.



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