The documentation doesn't say how and the tutorial completely ignores for loops.
As of 1.0, for loops work with values of types with the Iterator
trait.
The book describes this technique in chapter 3.5 and chapter 13.2.
If you are interested in how for loops operate, see the described syntactic sugar in Module std::iter.
Example:
fn main() {
let strs = ["red", "green", "blue"];
for sptr in strs.iter() {
println!("{}", sptr);
}
}
If you just want to iterate over a range of numbers, as in C's for loops, you can create a numeric range with the a..b
syntax:
for i in 0..3 {
println!("{}", i);
}
If you need both, the index and the element from an array, the idiomatic way to get that is with the Iterator::enumerate
method:
fn main() {
let strs = ["red", "green", "blue"];
for (i, s) in strs.iter().enumerate() {
println!("String #{} is {}", i, s);
}
}
Notes:
The loop items are borrowed references to the iteratee elements. In this case, the elements of
strs
have type&'static str
- they are borrowed pointers to static strings. This meanssptr
has type&&'static str
, so we dereference it as*sptr
. An alternative form which I prefer is:for &s in strs.iter() { println!("{}", s); }
for i in (0..3).rev() { // Code here... }
Reference: doc.rust-lang.org/book/ch03-05-control-flow.html –
Holcman i
a u8
? I did for i: u8 in 0..26 {
and it is not working. –
Interlanguage for i in 0u8..26u8
(one of the u8
s can even be omitted, but that may be confusing for beginners) –
Inbeing for i in range(0, 100)
is now deprecated in favour of for i in 0..100
(according to rustc 1.0.0-nightly
.
Also worth noting is the compiler can't disambiguate when you use an identifier in the range (e.g., for i in 0..a
), so you have to use for i in (0..a)
, but there's a pull request submitted to fix this.
Actually, the Loops section of the tutorial does cover for
loops:
When iterating over a vector, use
for
instead.for elt in ["red", "green", "blue"] { std::io::println(elt); }
But if you needed indices, you could do something like the following, using the uint::range
function from the core library (or int::range
or u8::range
or u32::range
or u64::range
) and Rust's syntax for blocks:
range(0u, 64u, {|i| C[i] = A[i] + B[i]});
Rust used to support this equivalent syntax but it was later removed:
range(0u, 64u) {|i|
C[i] = A[i] + B[i];
}
fn(args...)
instead of |args|
. –
Congratulation {|args| body}
is used to denote a closure rather than just a function. It's also really convenient for simplifying usage of anonymous functions as you might see them used in Javascript, since any function that accepts a closure as its last argument (such as a callback) can be written after the function call, as in Lindsey's third example above. Finally, even though Rust has a few different types of closures, Rust can infer the type of closure you want when using the block syntax. See also doc.rust-lang.org/doc/tutorial.html#closures –
Buie let range = (start..end).collect::<Vec<i32>>();
FromIterator<usize>
for Vec<i32>
but not Vec<i64>
? Would love to use this syntax but i64
is so common... –
Istic Note that as of rustc 0.4 (Oct 2012), the alternate construction of
range(0u, 64u) {|i|
C[i] = A[i] + B[i];
}
appears to not be supported any more.
range in fn:
fn print_range(range: std::ops::Range<i32>) {
for num in range {
println!("{}", num);
}
}
fn main() {
let my_range = 1..=5;
print_range(my_range);
}
Use int::range.
© 2022 - 2024 — McMap. All rights reserved.