Как использовать бесконечный диапазон в Ruby?

Относительно недавно, в Ruby появилась новая нотация для бесконечных диапазонов. Вероятно, более правильно их назвать полу-бесконечными.

Запись полу-бесконечного диапазона такая же, как и стандартных диапазонов. С одним лишь отличием - обе записи (с двумя и тремя точками) не имеют конечного аргумента.

(1..) # можно записать как (1..nil)

(1...) # можно записать как (1..nil)

Range.new(1, nil) # можно еще и так записать

Отметим, что (1..) и (1...) не равны, хотя технически реализуют один функционал.

(1..) == (1...)
=> false

Проверим размер последовательностей:

(1..).size
=> Infinity

(1...).size
=> Infinity

Range.new(1, nil).size
=> Infinity

Одним из реальных примеров использования нотации бесконечного диапазона в Ruby - доступ к последовательности элементов начиная от X и заканчивая последним.

Раннее это реализовывалось следующим образом при использовании '-1':

[:a, :b, :c, :d, :e, :f][2..-1]
=> [:c, :d, :e, :f] 

В новом варианте с использованием бесконечного диапазона, аналогичную операцию можно провести вот так:

[:a, :b, :c, :d, :e, :f][2..] # как было сказано выше, можно использовать две или три точки, результат одинаковый
=> [:c, :d, :e, :f]

Если попробовать получить последний элемент (.last) бесконечного диапазона - получим ошибку: RangeError (cannot get the last element of endless range).

Endless Ranges доступен в Ruby 2.6 и выше.