Skip to content

Commit 52c3380

Browse files
committed
loop_break_value: add documentation for book
1 parent bedd7da commit 52c3380

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

src/doc/unstable-book/src/language-features/loop-break-value.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,89 @@ The tracking issue for this feature is: [#37339]
44

55
[#37339]: https://github.com/rust-lang/rust/issues/37339
66

7+
Documentation to be appended to section 3.6 of the book: Loops (after "Loop Labels", or before if
8+
the "Break" section is moved). If this is deemed too complex a feature this early in the book, it
9+
could also be moved to a new section (please advise). This would allow examples breaking with
10+
non-primitive types, references, and discussion of coercion (probably unnecessary however).
11+
712
------------------------
813

14+
### Loops as expressions
15+
16+
Like everything else in Rust, loops are expressions; for example, the following is perfectly legal,
17+
if rather useless:
18+
19+
```rust
20+
let result = for n in 1..4 {
21+
println!("Hello, {}", n);
22+
};
23+
assert_eq!(result, ());
24+
```
25+
26+
Until now, all the loops you have seen evaluate to either `()` or `!`, the latter being special
27+
syntax for "no value", meaning the loop never exits. A `loop` can instead evaluate to
28+
a useful value via *break with value*:
29+
30+
```rust
31+
// Find the first square number over 1000:
32+
let mut n = 1;
33+
let square = loop {
34+
if n * n > 1000 {
35+
break n * n;
36+
}
37+
n += 1;
38+
};
39+
```
40+
41+
The evaluation type may be specified externally:
42+
43+
```rust
44+
// Declare that value returned is unsigned 64-bit:
45+
let n: u64 = loop {
46+
break 1;
47+
};
48+
```
49+
50+
It is an error if types do not agree, either between a "break" value and an external requirement,
51+
or between multiple "break" values:
52+
53+
```rust
54+
loop {
55+
if random_bool() {
56+
break 1u32;
57+
} else {
58+
break 0u8; // error: types do not agree
59+
}
60+
};
61+
62+
let n: i32 = loop {
63+
break 0u32; // error: type does not agree with external requirement
64+
};
65+
```
66+
67+
For now, breaking with a value is only possible with `loop`; the same functionality may
68+
some day be added to `for` and `while` (this would require some new syntax like
69+
`while f() { break 1; } default { break 0; }`).
70+
71+
#### Break: label, value
72+
73+
Four forms of `break` are available, where EXPR is some expression which evaluates to a value:
74+
75+
1. `break;`
76+
2. `break 'label;`
77+
3. `break EXPR;`
78+
4. `break 'label EXPR;`
79+
80+
When no value is given, the value `()` is assumed, thus `break;` is equivalent to `break ();`.
981

82+
Using a label allows returning a value from an inner loop:
1083

84+
```rust
85+
let result = 'outer: loop {
86+
for n in 1..10 {
87+
if n > 4 {
88+
break 'outer n;
89+
}
90+
}
91+
};
92+
```

0 commit comments

Comments
 (0)