← Back to Rust Course | Chapter 3: Control Flow | Lesson 6 of 7

Breaking with a Value

You can make a break hand back a result, so the loop itself becomes the answer to a question.
Syntax
rust
let name = loop {
    // body
    if condition {
        break value;
    }
};

Returning a Value on Break

When a loop is exited using break some_value;, that value becomes the result of the entire loop expression, which can then be stored in a variable.

Example: Returning a Value on Break

markup
// Entry point: execution of the program starts here
fn main() {
    // Declare a mutable variable `counter`, initialized to `0`
    let mut counter = 0;
    // Declare an immutable variable `result`; its value comes from the block below
    let result = loop {
        counter += 1;
        // Check whether `counter == 10`
        if counter == 10 {
            break counter;
        }
    };
    // Print "Loop returned: {}" to the console, substituting in `result` (with a trailing newline)
    println!("Loop returned: {}", result);
}

Multiple break Points

A single loop can contain more than one break statement along different code paths, as long as every one of them produces a value of the same type.

Example: Multiple break Points

markup
// Entry point: execution of the program starts here
fn main() {
    // Declare a mutable variable `n`, initialized to `1`
    let mut n = 1;
    // Declare an immutable variable `outcome`; its value comes from the block below
    let outcome = loop {
        n *= 2;
        // Check whether `n > 100`
        if n > 100 {
            break "too big";
        }
        // Check whether `n == 64`
        if n == 64 {
            break "found sixty-four";
        }
    };
    // Print "{}" to the console, substituting in `outcome` (with a trailing newline)
    println!("{}", outcome);
}

Why Only loop Supports This

while and for loops can also end because their condition became false or the iterator was exhausted, so there is no single guaranteed exit value to return. loop has no implicit exit, so break value is unambiguous.

Example: Why Only loop Supports This

markup
// Entry point: execution of the program starts here
fn main() {
    // Declare an immutable variable `target`, set to `5`
    let target = 5;
    // Declare a mutable variable `current`, initialized to `0`
    let mut current = 0;
    // Declare an immutable variable `found_at`; its value comes from the block below
    let found_at = loop {
        current += 1;
        // Check whether `current == target`
        if current == target {
            break current;
        }
    };
    // Print "Found target at iteration {}" to the console, substituting in `found_at` (with a trailing newline)
    println!("Found target at iteration {}", found_at);
}

Combining with match on the Result

Because break value produces an ordinary value, you can immediately use it with other expressions, such as feeding it directly into a match.

Example: Combining with match on the Result

markup
// Entry point: execution of the program starts here
fn main() {
    // Declare a mutable variable `i`, initialized to `0`
    let mut i = 0;
    // Declare an immutable variable `parity`; its value comes from the block below
    let parity = loop {
        i += 3;
        // Check whether `i > 10`
        if i > 10 {
            break i % 2;
        }
    };
    // Match on `parity` and branch by pattern
    match parity {
        0 => println!("Ended on an even number"),
        _ => println!("Ended on an odd number"),
    }
}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
Common Mistakes
  1. Trying to use break value; inside a for or while loop -- only loop can return a value this way.
  2. Forgetting a semicolon after a loop expression when assigning its result, since the whole loop {} is treated as one expression.
  3. Mismatching the types produced by different break statements within the same loop, which fails to compile.
Chapter Summary
  • break value; only works inside loop, because only loop is guaranteed to be exited exclusively via break.
  • The value passed to break becomes the value of the entire loop expression.
  • All break statements within the same loop must produce values of the same type.
  • This pattern is common for retry-until-success logic where the result is only known once the loop ends.
🔒

Chapter Quiz — Complete all 7 topics to unlock

0/7 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.