Ruby 2.7 adds beginless range


Ruby 2.7 adds beginless range .

Beginless Range

We can now use Beginless Range in Ruby 2.7.

# define an array
a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# In ruby 2.6 or earlier
a[0..2]
=> [1, 2, 3]
# In Ruby 2.7.0
a[..2]
=> [1, 2, 3]
a[...2]
=> [1, 2]

In case statements, we can use startless range to express “below this value”.

case created_at
when ...2.months.ago
  puts "old"
when 2.months.ago...Date.today
  puts "recent"
when Date.today..
  puts "upcoming"
end

It can be used to define constants in a similar way:

# Exam Scores
CLASSES = {
	..33 => :fail,
	34..49 => :third,
	50..59 => :second,
	60..65 => :first,
	66.. => :first_with_distinction
}

We can use beginless ranges in DSLs as well.

# Get the list of items whose price is less than or equal to 200
> Item.where(price: ..200)
Item Load (0.2ms)  SELECT "items".* FROM "items" WHERE "items"."price" <= ? LIMIT ?  [["price", 200], ["LIMIT", 11]]
#<ActiveRecord::Relation [#<Product id: 1, price: 200, name: "Item 1", created_at: "2019-08-20 06:37:02", updated_at: "2019-08-20 06:37:02">, ...]>

# Get the list of items whose price is less than 200
> Item.where(price: ...200)
Item Load (0.2ms)  SELECT "items".* FROM "items" WHERE "items"."price" < ? LIMIT ?  [["price", 200], ["LIMIT", 11]]
#<ActiveRecord::Relation [#<Product id: 5, price: 100, name: "Item 5", created_at: "2019-08-20 06:37:29", updated_at: "2019-08-20 06:37:29">]>

Beginless range help out to get write DSL’s in a more natural way.