Project

General

Profile

Feature #14799

Startless range

Added by zverok (Victor Shepelev) over 2 years ago. Updated over 1 year ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-core:87313]

Description

On introduction of endless range at #12912, "startless range" was discussed this way:

sowieso (So Wieso): Not having the opposite (..5 and ..-2) feels like this is rather a hack than a thoroughly planned feature.

duerst (Martin Dürst): I don't understand the need for a ..5 Range. The feature is called "endless range". Although mathematically, it's possible to think about startless ranges, they don't work in a program. Maybe some programming languages have ..5 as a shortcut for 0..5, but that's in any way a usual, bounded, range with a start and an end. It's conceptually totally different from 5.., which is a range with a start but no end, an unbound range.

In the context of that ticket (ranges used mostly for slicing arrays) having ..5 was indeed hard to justify, but there are other cases when ..5 being -Infinity..5 is absolutely reasonable:

case release_date
when ..1.year.ago 
  puts "ancient"
when 1.year.ago..3.months.ago
  puts "old"
when 3.months.ago..Date.today
  puts "recent"
when Date.today..
  puts "upcoming"
end

log.map(&:logged_at).grep(..Date.new(1980)) # => outliers due to bad log parsing...

E.g., whenever case equality operator is acting, having startless range to express "below this value" is the most concise and readable way. Also, for expressing constants (mostly decorative, but very readable):

# Celsius degrees
WORK_RANGES = {
   ..-10 => :turn_off,
  -10..0 => :energy_saving,
  0..20 => :main,
  20..35 => :cooling,
  35.. => :turn_off
}

In addition, my related proposal #14784 suggests that this kind of ranges could be utilized by more powerful clamp too:

updated_at.clamp(..Date.today)

Uncertainty points:

  • Would it be hard to add to parser? I am not sure, I am not very good at it :(
  • Should .. be a thing? I guess not, unless there would be convincing real-life examples, which for me it is hard to think of.

Files

beginless-range.patch (3.55 KB) beginless-range.patch mame (Yusuke Endoh), 05/31/2018 11:33 AM

Related issues

Related to Ruby master - Bug #15745: There is no symmetry in the beginless range and the endless range using `Range#inspect`ClosedActions

Also available in: Atom PDF