Циклы в Rust

Помимо гибких условных операторов, конструкции циклов в Rust также очень хорошо продуманы. Как закалённый в боях разработчик, вы должны это почувствовать.

цикл while

Цикл while — наиболее типичный условный цикл:

Пример

fn main() {
    let mut number = 1;
    while number != 4 {
        println!("{}", number);
        число += 1;
    }
    println!("EXIT");
}

Вывод:

1
2
3
EXIT

На момент написания этого руководства в Rust нет конструкции do-while, но `do` указано как зарезервированное слово и может быть использовано в будущих версиях.

В C цикл for использует выражение из трёх частей для управления циклом, но в Rust такой конструкции нет, поэтому вместо него приходится использовать цикл while:

Язык C

int i;
for (i = 0; i < 10; i++) {
    // тело цикла
}

Rust

let mut i = 0;
while i < 10 {
    // тело цикла
    i += 1;
}

цикл for

Цикл for — наиболее часто используемая конструкция цикла, часто применяется для перебора линейной структуры данных (например, массива). Цикл for перебирает массив:

Пример

fn main() {
    let a = [10, 20, 30, 40, 50];
    for i in a.iter() {
        println!("Value is: {}", i);
    }
}

Вывод:

值为 : 10
值为 : 20
值为 : 30
值为 : 40
值为 : 50

Цикл for в этой программе перебирает массив a. `a.iter()` представляет итератор a; мы не будем вдаваться в подробности до изучения объектов.

Конечно, цикл for также может обращаться к массиву по индексу:

Пример

fn main() {
let a = [10, 20, 30, 40, 50];
    for i in 0..5 {
        println!("a[{}] = {}", i, a[i]);
    }
}

Вывод:

a[0] = 10
a[1] = 20
a[2] = 30
a[3] = 40
a[4] = 50

loop Цикл

Опытные разработчики наверняка сталкивались с ситуациями, когда цикл не может определить в начале или в конце, продолжать ли выполнение, и выполнение цикла должно контролироваться где-то в середине тела цикла. В таких случаях мы часто реализуем досрочный выход из цикла внутри цикла `while (true)`.

В Rust есть встроенная конструкция бесконечного цикла — `loop`:

Пример

fn main() {
    let s = ['R', 'U', 'N', 'O', 'O', 'B'];
    let mut i = 0;
    loop {
        let ch = s[i];
        if ch == 'O' {
            break;
        }
        println!("\'{}\'", ch);
        i += 1;
    }
}

Вывод:

'R' 
'U' 
'N' 

Цикл `loop` может использовать ключевое слово `break`, подобно `return`, чтобы выйти из всего цикла и передать возвращаемое значение наружу. Это очень остроумный дизайн, потому что цикл `loop` часто используется как инструмент поиска; если что-то найдено, конечно, результат следует вернуть:

Пример

fn main() {
    let s = ['R', 'U', 'N', 'O', 'O', 'B'];
    let mut i = 0;
    let location = loop {
        let ch = s[i];
        if ch == 'O' {
            break i;
        }
        i += 1;
    };
    println!(" \'O\''s index is {}", location);
}

Вывод:

 'O' 的索引为 3
Другие расширения