Learn back-end development by writing real code

Boot.dev Blog ยป Rust ยป How to Break From Nested Loops in Rust

How to Break From Nested Loops in Rust

By Lane Wagner on May 14, 2020

Curated backend podcasts, videos and articles. All free.

If you're looking to become a backend developer, or just stay up-to-date with the latest backend technologies and trends, you found the right place. Subscribe below to get a copy of our newsletter, The Boot.dev Beat, each month in your inbox. No spam, no sponsors, totally free.

Loops in Rust aren’t the same as standard C-style languages. The syntax is different and there are some powerful options that make looping easier. First, let’s go over some looping basics, then we will cover how to handle breaking and continuing in nested loops in Rust.

๐Ÿ”— Standard For-Loop

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

Which prints:

0
1
2
3
4
5
6
7
8
9

0..10 is an iterator where the lower-bound is inclusive and the upper bound is exclusive.

More generically:

for var in iterator {
    // do stuff
}

In my opinion, all languages should move to a single syntax with for-loops based on iterators. The simplicity makes Rust’s loops easy to read, while the ability to create custom iterators makes it more powerful than even more verbose formats like Go’s:

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

Rust’s for-loop doesn’t specify what happens after each iteration (i++) or what condition is required to continue the loop (i < 10), an iterator is simply supplied.

๐Ÿ”— Continue and Break

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

The continue keyword works in a familiar manner. In this example when x > 5 AND x < 7 the loop continues to the next iteration without printing. This results in:

0
1
2
3
4
5
7
8
9

The break keyword is also familiar:

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

which prints:

0
1
2
3
4
5

๐Ÿ”— Working With Nested Loops

Nested loops can get tricky in a lot of languages. What if I want to continue through an outer loop when a condition within an inner loop occurs? We can do the following:

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

prints:

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

By using the label 'outer we are able to control explicitly which loop is broken. The default would have been to just break from the inner loop. The same labeling system works with the continue keyword as well.

Find a problem with this article?

Report an issue on GitHub