Ответ 1
Начиная с 1.0, циклы for работают со значениями типов с чертой Iterator
.
Книга описывает эту технику в главе 3.5 и главе 13.2.
Если вас интересует, как работают циклы, посмотрите описанный синтаксический сахар здесь:
http://doc.rust-lang.org/std/iter/index.html
Пример:
fn main() {
let strs = ["red", "green", "blue"];
for sptr in strs.iter() {
println!("{}", sptr);
}
}
Если вы просто хотите перебрать диапазон чисел, как в C for
циклов, вы можете создать числовой диапазон с синтаксисом a..b
:
for i in 0..3 {
println!("{}", i);
}
Если вам нужны и индекс, и элемент из массива, идиоматический способ получить это с помощью Iterator::enumerate
:
fn main() {
let strs = ["red", "green", "blue"];
for (i, s) in strs.iter().enumerate() {
println!("String #{} is {}", i, s);
}
}
Заметки:
-
Элементы цикла являются заимствованными ссылками на элементы iteratee. В этом случае элементы
strs
имеют тип&'static str
- они заимствованы указатели на статические строки. Это означает, чтоsptr
имеет тип&&'static str
поэтому мы разыменовываем его как*sptr
. Альтернативная форма, которую я предпочитаю:for &s in strs.iter() { println!("{}", s); }