]>
Commit | Line | Data |
---|---|---|
9346a6ac AL |
1 | % for Loops |
2 | ||
3 | The `for` loop is used to loop a particular number of times. Rust’s `for` loops | |
4 | work a bit differently than in other systems languages, however. Rust’s `for` | |
5 | loop doesn’t look like this “C-style” `for` loop: | |
6 | ||
7 | ```c | |
8 | for (x = 0; x < 10; x++) { | |
9 | printf( "%d\n", x ); | |
10 | } | |
11 | ``` | |
12 | ||
13 | Instead, it looks like this: | |
14 | ||
15 | ```rust | |
16 | for x in 0..10 { | |
17 | println!("{}", x); // x: i32 | |
18 | } | |
19 | ``` | |
20 | ||
21 | In slightly more abstract terms, | |
22 | ||
23 | ```ignore | |
24 | for var in expression { | |
25 | code | |
26 | } | |
27 | ``` | |
28 | ||
29 | The expression is an [iterator][iterator]. The iterator gives back a series of | |
30 | elements. Each element is one iteration of the loop. That value is then bound | |
31 | to the name `var`, which is valid for the loop body. Once the body is over, the | |
32 | next value is fetched from the iterator, and we loop another time. When there | |
33 | are no more values, the `for` loop is over. | |
34 | ||
35 | [iterator]: iterators.html | |
36 | ||
37 | In our example, `0..10` is an expression that takes a start and an end position, | |
38 | and gives an iterator over those values. The upper bound is exclusive, though, | |
39 | so our loop will print `0` through `9`, not `10`. | |
40 | ||
41 | Rust does not have the “C-style” `for` loop on purpose. Manually controlling | |
42 | each element of the loop is complicated and error prone, even for experienced C | |
43 | developers. | |
62682a34 SL |
44 | |
45 | # Enumerate | |
46 | ||
47 | When you need to keep track of how many times you already looped, you can use the `.enumerate()` function. | |
48 | ||
49 | ## On ranges: | |
50 | ||
51 | ```rust | |
52 | for (i,j) in (5..10).enumerate() { | |
53 | println!("i = {} and j = {}", i, j); | |
54 | } | |
55 | ``` | |
56 | ||
57 | Outputs: | |
58 | ||
59 | ```text | |
60 | i = 0 and j = 5 | |
61 | i = 1 and j = 6 | |
62 | i = 2 and j = 7 | |
63 | i = 3 and j = 8 | |
64 | i = 4 and j = 9 | |
65 | ``` | |
66 | ||
67 | Don't forget to add the parentheses around the range. | |
68 | ||
69 | ## On iterators: | |
70 | ||
71 | ```rust | |
72 | # let lines = "hello\nworld".lines(); | |
73 | for (linenumber, line) in lines.enumerate() { | |
74 | println!("{}: {}", linenumber, line); | |
75 | } | |
76 | ``` | |
77 | ||
78 | Outputs: | |
79 | ||
80 | ```text | |
81 | 0: Content of line one | |
82 | 1: Content of line two | |
83 | 2: Content of line tree | |
84 | 3: Content of line four | |
85 | ``` |