@@ -4,7 +4,80 @@ The tracking issue for this feature is: [#37339]
4
4
5
5
[ #37339 ] : https://github.com/rust-lang/rust/issues/37339
6
6
7
+ Documentation to be appended to section G of the book.
8
+
7
9
------------------------
8
10
11
+ ### Loops as expressions
12
+
13
+ Like most things in Rust, loops are expressions, and have a value; normally ` () ` unless the loop
14
+ never exits.
15
+ A ` loop ` can instead evaluate to a useful value via * break with value* :
16
+
17
+ ``` rust
18
+ #![feature(loop_break_value)]
19
+
20
+ // Find the first square number over 1000:
21
+ let mut n = 1 ;
22
+ let square = loop {
23
+ if n * n > 1000 {
24
+ break n * n ;
25
+ }
26
+ n += 1 ;
27
+ };
28
+ ```
29
+
30
+ The evaluation type may be specified externally:
31
+
32
+ ``` rust
33
+ #![feature(loop_break_value)]
34
+
35
+ // Declare that value returned is unsigned 64-bit:
36
+ let n : u64 = loop {
37
+ break 1 ;
38
+ };
39
+ ```
40
+
41
+ It is an error if types do not agree, either between a "break" value and an external requirement,
42
+ or between multiple "break" values:
43
+
44
+ ``` no_compile
45
+ #![feature(loop_break_value)]
46
+
47
+ loop {
48
+ if true {
49
+ break 1u32;
50
+ } else {
51
+ break 0u8; // error: types do not agree
52
+ }
53
+ };
54
+
55
+ let n: i32 = loop {
56
+ break 0u32; // error: type does not agree with external requirement
57
+ };
58
+ ```
59
+
60
+ #### Break: label, value
61
+
62
+ Four forms of ` break ` are available, where EXPR is some expression which evaluates to a value:
63
+
64
+ 1 . ` break; `
65
+ 2 . ` break 'label; `
66
+ 3 . ` break EXPR; `
67
+ 4 . ` break 'label EXPR; `
68
+
69
+ When no value is given, the value ` () ` is assumed, thus ` break; ` is equivalent to ` break (); ` .
70
+
71
+ Using a label allows returning a value from an inner loop:
9
72
73
+ ``` rust
74
+ #![feature(loop_break_value)]
10
75
76
+ let result = 'outer : loop {
77
+ for n in 1 .. 10 {
78
+ if n > 4 {
79
+ break 'outer n ;
80
+ }
81
+ }
82
+ };
83
+ ```
0 commit comments