Тип Range или последовательность представляет некоторый диапазон элементов. В Rust последовательности используются чаще всего для получения какой-то части набора элементов, например, массива или строки. Хотя этим применение последовательностей не ограничивается.
Для создания последовательности применяется оператор .. (две точки). Его общая форма:
начальное_значение .. конечное_значение
Слева от оператора .. указывается начальное значение диапазона, а справа - конечное значение. При этом конечное значение не включается в диапазон.
Также стоит отметить, что если начальное значение больше конечного, то последовательность будет пустой.
Например:
fn main(){ let numbers = 1..9; for num in numbers{ print!("{} ", num); // 1 2 3 4 5 6 7 8 } }
В данном случае образуется последовательность чисел от 1 до 9 (число 9 не включается в последовательность). А с помощью цикла for можно перебрать последовательность.
Хотя мы можем использовать оператор .. для создания последовательности, но в реальности она представляет структуру std::ops::Range, которая имеет два поля: start (начальное значение) и end (конечное значение). Например, предыдущий пример мы могли бы переписать так:
fn main(){ let numbers = std::ops::Range { start: 1, end: 9 }; for num in numbers{ print!("{} ", num); // 1 2 3 4 5 6 7 8 } }
Также для определения последовательности можно использовать модификацию оператора - ..=, которая позволяет включить в набор конечное значение:
fn main(){ let numbers = 1..=9; // число 9 включается в последовательность for num in numbers{ print!("{} ", num); // 1 2 3 4 5 6 7 8 9 } }
Последовательности очень удобно применять, если нам нужно взять какую-то часть массива. Например:
fn main(){ let numbers = [1, 2, 3, 4, 5, 6, 7, 8]; for num in numbers[1..5].iter(){ print!("{} ", num) // 2 3 4 5 } }
Более подробно использование последовательностей для извлечения поднабора рассматривается в теме про тип slice.