Подтвердить что ты не робот

Как вы делаете диапазон в Rust?

Документы не говорят, как, и учебник полностью игнорирует циклы.

4b9b3361

Ответ 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];
}

похоже, больше не поддерживается.