Skip to content

Commit e276965

Browse files
committed
Document label_break_value in the reference
1 parent 9fce337 commit e276965

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

src/expressions/loop-expr.md

+26-2
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,18 @@
1414
[_PredicateLoopExpression_]: #predicate-loops
1515
[_PredicatePatternLoopExpression_]: #predicate-pattern-loops
1616
[_IteratorLoopExpression_]: #iterator-loops
17+
[_LabelBreakExpression_]: #label-expressions
1718

18-
Rust supports four loop expressions:
19+
Rust supports five loop expressions:
1920

2021
* A [`loop` expression](#infinite-loops) denotes an infinite loop.
2122
* A [`while` expression](#predicate-loops) loops until a predicate is false.
2223
* A [`while let` expression](#predicate-pattern-loops) tests a pattern.
2324
* 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.
2426

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).
2629
Only `loop` supports [evaluation to non-trivial values](#break-and-loop-values).
2730

2831
## Infinite loops
@@ -193,6 +196,18 @@ A loop expression may optionally have a _label_. The label is written as a lifet
193196
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.
194197
See [break expressions](#break-expressions) and [continue expressions](#continue-expressions).
195198

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+
196211
## `break` expressions
197212

198213
> **<sup>Syntax</sup>**\
@@ -226,6 +241,15 @@ Example:
226241

227242
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`.
228243

244+
## Label expressions
245+
246+
> **<sup>Syntax</sup>**\
247+
> _LabelBreakExpression_ :\
248+
> &nbsp;&nbsp; [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+
229253
## `continue` expressions
230254

231255
> **<sup>Syntax</sup>**\

0 commit comments

Comments
 (0)