Диапазон
Диапазон представляет собой интервал между двумя значениями. Обычно он создаётся с помощью литерала диапазона, состоящего из двух или трёх точек:
-
x..y: Две точки обозначают включительный диапазон, включающийxиy, а также все промежуточные значения (в математике:[x, y]) . -
x...y: Три точки обозначают исключительный диапазон, включающийxи все значения вплоть доy, но не включая его (в математике:[x, y)).
(0..5).to_a # => [0, 1, 2, 3, 4, 5]
(0...5).to_a # => [0, 1, 2, 3, 4]
Примечание
Литералы диапазонов часто заключают в скобки, например, если диапазон должен использоваться в качестве получателя вызова. 0..5.to_a без скобок был бы семантически эквивалентен 0..(5.to_a), поскольку вызовы методов и другие операторы имеют более высокий приоритет, чем литерал диапазона.
Чтобы запомнить, какой диапазон включительный, а какой исключительный, представьте, что дополнительная точка отталкивает y дальше, оставляя его за пределами диапазона.
Литерал x..y семантически эквивалентен явному конструктору Range.new(x, y), а x...y — Range.new(x, y, true).
Начальное и конечное значения не обязательно должны быть одного типа: true..1 — допустимый диапазон, хотя и довольно бесполезный, поскольку методы Enumerable не будут работать с несовместимыми типами. Как минимум они должны быть сравнимыми.
Диапазоны, начинающиеся с nil, называются диапазонами без начала, а диапазоны, заканчивающиеся на nil, — диапазонами без конца. В записи литерала можно опустить nil: x.. — диапазон без конца, начинающийся с x, а ..x — диапазон без начала, заканчивающийся на x.
numbers = [1, 10, 3, 4, 5, 8]
numbers.select(6..) # => [10, 8]
numbers.select(..6) # => [1, 3, 4, 5]
numbers[2..] = [3, 4, 5, 8]
numbers[..2] = [1, 10, 3]
Диапазон без начала и без конца допустим; его можно записать как .. или ..., но обычно он не очень полезен.
To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/syntax_and_semantics/literals/range.html