Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Циклы

while

Цикл while в Rust работает и выглядит так же, как и в других императивных языках:

while условие {
  тело цикла
}

Например, вывод на консоль чисел от 5 до 0 (не включительно).

fn main() {
    let mut n = 5;
    while n > 0 {
        println!("{n}");
        n -= 1;
    }
}

do-while

В Rust нет цикла do-while, но при большой необходимости его можно имитировать через while:

Такой код
fn main() {
    let mut start = 0;
    let mut sum = 0;

    while {
        sum += start;
        start += 1;
        start < 10
    } {};

    println!("sum: {}", sum);
}
работает словно
fn main() {
    let mut start = 0;
    let mut sum = 0;

    do {
        sum += start;
        start += 1;
    } while start < 10;

    println!("sum: {}", sum);
}

loop

В Rust есть специальный “бесконечный” цикл — loop. По сути, это просто аналог while true.

loop {
  тело цикла
}

Как и из while true цикла, из loop можно выйти при помощи оператора break.

Например: программа, которая выводит те элементы последовательности Фибоначчи, которые меньше указанного числа (мы подразумеваем, что указанное число всегда больше 1).

fn main() {
    let maximum = 30;
    let mut a = 0;
    let mut b = 1;
    print!("{a} {b}");
    loop {
        let next = a + b;
        if next > maximum {
            break;
        }
        print!(" {next}");
        a = b;
        b = next;
    }
}

Оператор break для цикла loop имеет еще одну функциональность: он возвращает значение.

#![allow(unused)]
fn main() {
let mut counter = 0;
let result = loop {
    counter += 1;
    if counter == 10 {
        break counter * 2; // возвращаем из цикла
    }
};
println!("The result is {}", result); // 20
}

Тип оператора break — never type.

for

В Rust отсутствует “классический” цикл for (как в C) — только for-each, который предназначен для перебора элементов последовательностей.

Синтаксис:

for переменная in последовательность {
  тело цикла
}

Пример: перебор элементов массива.

fn main() {
    let arr = [10, 20, 30, 40, 50];
    
    for element in arr {
        println!("the value is: {}", element);
    }
}

При помощи for можно перебирать элементы массивов, слайсов, векторов и еще целого ряда коллекций.

Перебор диапазона

В Rust нет “классического” цикла for вида for (int i=0; i<N; i++). Однако такой перебор числового диапазона требуется довольно часто.

К счастью, в Rust есть диапазоны (Range), которые задаются как начало .. конец, и могут использоваться для перебора элементов в цикле for.

#![allow(unused)]
fn main() {
for i in 0 .. 10 {
    print!("{}, ", i);
}
// Напечатает: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
}

Этот цикл перебирает числа от 0 до 10 (не включительно).

Чтобы перебрать числа от 0 до 10 (включительно), надо вместо 0 .. 10 указать 0 ..= 10.

Note

Детальнее о цикле for мы поговорим в главах Владение и Итераторы. Также в главе про Итераторы мы подробнее разберём диапазоны.