Как использовать бесконечный диапазон в 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 и выше.