|
14 | 14 | [_PredicateLoopExpression_]: #predicate-loops
|
15 | 15 | [_PredicatePatternLoopExpression_]: #predicate-pattern-loops
|
16 | 16 | [_IteratorLoopExpression_]: #iterator-loops
|
| 17 | +[_LabelBreakExpression_]: #label-expressions |
17 | 18 |
|
18 |
| -Rust supports four loop expressions: |
| 19 | +Rust supports five loop expressions: |
19 | 20 |
|
20 | 21 | * A [`loop` expression](#infinite-loops) denotes an infinite loop.
|
21 | 22 | * A [`while` expression](#predicate-loops) loops until a predicate is false.
|
22 | 23 | * A [`while let` expression](#predicate-pattern-loops) tests a pattern.
|
23 | 24 | * A [`for` expression](#iterator-loops) extracts values from an iterator, looping until the iterator is empty.
|
| 25 | +* A [labelled `break` expression](#label-expressions) runs a loop exactly once, but allows exiting the loop early. |
24 | 26 |
|
25 |
| -All four types of loop support [`break` expressions](#break-expressions), [`continue` expressions](#continue-expressions), and [labels](#loop-labels). |
| 27 | +All five types of loop support [`break` expressions](#break-expressions), and [labels](#loop-labels). |
| 28 | +All except labelled `break` expressions support [`continue` expressions](#continue-expressions). |
26 | 29 | Only `loop` supports [evaluation to non-trivial values](#break-and-loop-values).
|
27 | 30 |
|
28 | 31 | ## Infinite loops
|
@@ -193,6 +196,18 @@ A loop expression may optionally have a _label_. The label is written as a lifet
|
193 | 196 | If a label is present, then labeled `break` and `continue` expressions nested within this loop may exit out of this loop or return control to its head.
|
194 | 197 | See [break expressions](#break-expressions) and [continue expressions](#continue-expressions).
|
195 | 198 |
|
| 199 | +Labels follow the hygiene and shadowing rules of local variables. For example, this code will print "outer loop": |
| 200 | + |
| 201 | +```rust |
| 202 | +'a: loop { |
| 203 | + 'a: loop { |
| 204 | + break 'a; |
| 205 | + } |
| 206 | + print!("outer loop"); |
| 207 | + break 'a; |
| 208 | +} |
| 209 | +``` |
| 210 | + |
196 | 211 | ## `break` expressions
|
197 | 212 |
|
198 | 213 | > **<sup>Syntax</sup>**\
|
@@ -226,6 +241,15 @@ Example:
|
226 | 241 |
|
227 | 242 | A `break` expression is only permitted in the body of a loop, and has one of the forms `break`, `break 'label` or ([see below](#break-and-loop-values)) `break EXPR` or `break 'label EXPR`.
|
228 | 243 |
|
| 244 | +## Label expressions |
| 245 | + |
| 246 | +> **<sup>Syntax</sup>**\ |
| 247 | +> _LabelBreakExpression_ :\ |
| 248 | +> [LIFETIME_OR_LABEL] [_BlockExpression_] |
| 249 | +
|
| 250 | +Label expressions are exactly like block expressions, except that they allow using `break` expressions within the block. |
| 251 | +Unlike other loops, `break` expressions within a label expression *must* have a label (i.e. the label is not optional). |
| 252 | + |
229 | 253 | ## `continue` expressions
|
230 | 254 |
|
231 | 255 | > **<sup>Syntax</sup>**\
|
|
0 commit comments