Документы не говорят, как, и учебник полностью игнорирует циклы.
Как вы делаете диапазон в Rust?
Ответ 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); }
Ответ 2
Собственно, раздел Loops учебника охватывает for
петли:
При итерации по вектору используйте
for
.for elt in ["red", "green", "blue"] { std::io::println(elt); }
Но если вам нужны индексы, вы можете сделать что-то вроде следующего, используя функцию uint::range
из основной библиотеки (или int::range
или u8::range
или u32::range
или u64::range
) и синтаксис Rust для блоков:
range(0u, 64u, {|i| C[i] = A[i] + B[i]});
Ржавчина, используемая для поддержки этого эквивалентного синтаксиса, но позже была удалена:
range(0u, 64u) {|i|
C[i] = A[i] + B[i];
}
Ответ 3
for i in range(0, 100)
теперь устарел в пользу for i in 0..100
(согласно rustc 1.0.0-nightly
.
Также стоит отметить, что компилятор не может устранить неоднозначность, когда вы используете идентификатор в диапазоне (например, for i in 0..a
), поэтому вам нужно использовать for i in (0..a)
, но там pull запрос, чтобы исправить это.
Ответ 4
Обратите внимание, что с rustc 0.4 (окт. 2012) альтернативная конструкция
range(0u, 64u) {|i|
C[i] = A[i] + B[i];
}
похоже, больше не поддерживается.
Ответ 5
Используйте int:: range.