Пост Петли в Rust; Breaking From Nested Loops впервые появился на Qvault.

Циклы в Rust — это не то же самое, что стандартные языки в стиле C. Синтаксис отличается, и есть несколько мощных опций, упрощающих создание циклов. Во-первых, давайте рассмотрим некоторые основы работы с циклами, а затем рассмотрим, как справляться с прерыванием и продолжением во вложенных циклах.

Стандартный цикл For

fn main() {
    for x in 0..10 {
        println!("{}", x);
    }
}

Что печатает:

0
1
2
3
4
5
6
7
8
9

0..10 — это итератор, в котором нижняя граница является инклюзивной, а верхняя — исключающей.

В более общем плане:

for var in iterator {
    // do stuff
}

На мой взгляд, все языки должны перейти на единый синтаксис с циклами for на основе итераторов. Простота делает циклы Rust легко читаемыми, а возможность создавать собственные итераторы делает его более мощным, чем даже более подробные форматы, такие как Go:

for i := 0; i < 10; i++ {
	fmt.Println(i)
}

Цикл for в Rust не указывает, что происходит после каждой итерации (i++) или какое условие требуется для продолжения цикла (i ‹ 10), просто предоставляется итератор.

Продолжить и прервать

for x in 0..10 {
    if x > 5 && x < 7 {
        continue
    }
    println!("{}", x);
}

Ключевое слово continue работает привычным образом. В этом примере, когда x > 5 И x ‹ 7, цикл переходит к следующей итерации без печати. Это приводит к:

0
1
2
3
4
5
7
8
9

Брейк тоже знаком:

for x in 0..10 {
    if x > 5{
        break
    }
    println!("{}", x);
}

который печатает:

0
1
2
3
4
5

Работа с вложенными циклами

Вложенные циклы могут быть сложными во многих языках. Что делать, если я хочу продолжить внешний цикл, когда возникает условие во внутреннем цикле? Мы можем сделать следующее:

'outer: for x in 0..5 {
    for y in 0..5 {
        if y > 2{
            break 'outer
        }
        println!("x: {}, y: {}", x, y);
    }
}

печатает:

x: 0, y: 0
x: 0, y: 1
x: 0, y: 2

Используя метку 'outer, мы можем явно контролировать, какой цикл разорван. По умолчанию было бы просто выйти из внутреннего цикла. Та же система меток работает и с ключевым словом continue.

Спасибо за чтение

Напишите мне в твиттере @wagslane, если у вас есть какие-либо вопросы или комментарии.

Следите за мной на Dev.to: wagslane

Пост Петли в Rust; Breaking From Nested Loops впервые появился на Qvault.