Пост Петли в 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.