Введение#
В языке Rust есть три основных вида циклов: while, loop и for. Для управления итерациями используются стандартные операторы:
break— немедленно прерывает выполнение цикла.continue— пропускает оставшуюся часть тела цикла и переходит к следующей итерации.
Давайте детально рассмотрим все виды циклов, способы обхода коллекций и работу с метками на интерактивных слайдах:
Виды циклов в Rust#
1. Цикл while#
Выполняет тело цикла до тех пор, пока условие истинно (true).
let mut n = 0;
while n < 10 {
foo(n);
n += 1;
}2. Цикл while let#
Повторяет выполнение цикла, пока выражение успешно сопоставляется с шаблоном (например, для разбора Option или Result).
// Цикл работает, пока foo() возвращает Some(x)
while let Some(x) = foo() {
bar(x);
}3. Цикл loop и возврат значений#
Бесконечный цикл, который выполняется до тех пор, пока не будет встречен явный оператор break.
- Использование как выражения:
loopможет возвращать значение через операторbreak. Это значение можно присвоить переменной.
let event = loop {
let event = get_event();
if let Some(e) = event {
break e; // Возвращает значение e из цикла loop
}
};4. Реализация цикла do ... while#
В Rust нет встроенного ключевого слова do-while. Его поведение можно сымитировать двумя способами:
- Через бесконечный
loopи проверку условия в конце:
loop {
let x = foo();
if x == 0 { break; }
}- Используя блок кода в качестве условия цикла
while:
while {
let x = foo();
x != 0 // Условие продолжения цикла
} {} // Пустое тело цикла
Диапазоны (Ranges) и цикл for#
Типы диапазонов (Range Types)#
Диапазоны представляют собой структуры из модуля std::ops. Нижняя граница (если она указана) всегда включается в диапазон.
| Синтаксис | Описание типа | Включение границ | Внутреннее представление |
|---|---|---|---|
.. | Неограниченный диапазон | Нет границ | RangeFull |
..10 | Ограниченный сверху диапазон | Исключая верхнюю границу (0-9) | RangeTo |
..=10 | Ограниченный сверху диапазон, включительно | Включая верхнюю границу (0-10) | RangeToInclusive |
0.. | Ограниченный снизу диапазон | От 0 до бесконечности | RangeFrom |
0..10 | Ограниченный диапазон | Включая 0, исключая 10 (0-9) | Range |
0..=10 | Ограниченный диапазон, включительно | Включая обе границы 0 и 10 (0-10) | RangeInclusive |
Пример: Цикл for n in 1..10 выполнится ровно 9 раз (для значений от 1 до 9 включительно).
Анатомия цикла for#
Цикл for используется для итерации по элементам коллекции или диапазона.
- Требование к типу: Выражение справа от
inобязано реализовывать типажstd::iter::IntoIterator.
В зависимости от необходимости владения данными или ссылками, применяются разные подходы:
- Потребление коллекции (Move):
for item in arr { ... }(неявно вызываетarr.into_iter()). - Итерация по разделяемым ссылкам (
&T):for item in &arr { ... }(неявно вызывает(&arr).into_iter()). - Итерация по изменяемым ссылкам (
&mut T):for item in &mut arr { ... }(неявно вызывает(&mut arr).into_iter()).
Получение индекса при итерации (.enumerate())#
Для одновременного получения индекса элемента и самого элемента используется метод .enumerate(), который возвращает кортеж вида (index, item).
let arr: [u8; 3] = [10, 20, 30];
for (idx, item) in arr.into_iter().enumerate() {
println!("{idx}: {item}");
}Метки циклов и блоков (Labels)#
Метки позволяют управлять выполнением конкретного внешнего цикла или блока изнутри вложенных структур. Названия меток всегда начинаются с одиночной кавычки (апострофа), например: 'label.
Метки в циклах#
Применяются для выхода из внешнего цикла при нахождении во вложенном.
'outer: loop {
'inner: loop {
if need_exit() {
break 'outer; // Полный выход из внешнего цикла
}
}
}Метки в именованных блоках кода#
Обычные блоки кода { ... } также могут иметь метки. Это позволяет досрочно прерывать выполнение текущего блока и возвращать значение во внешнюю переменную с помощью break.
let y = 'tag: {
let x = foo();
if x < 0 {
break 'tag 0; // Досрочный выход из блока с возвратом значения 0
}
x
};Ограничение компилятора: Оператор
breakбез указания явной метки внутри обычного обособленного блока кода (не являющегося циклом) вызовет ошибку компиляции.
Проверь свои знания!#
Пройдите короткий интерактивный тест, чтобы закрепить понимание циклов в Rust.
История обновлений
- Добавил интерактивные слайды и тесты по циклам, диапазонам и меткам.

