Как вы делаете диапазон в Rust? - PullRequest
24 голосов
/ 14 февраля 2012

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

Ответы [ 5 ]

23 голосов
/ 02 октября 2013

Начиная с 1.0, для циклов работают со значениями типов с признаком 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);
    }
    
11 голосов
/ 14 февраля 2012

На самом деле, раздел 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]});

Rust использовался для поддержки этого эквивалентного синтаксиса, но позже был удален:

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}
10 голосов
/ 13 января 2015

for i in range(0, 100) теперь не рекомендуется в пользу for i in 0..100 (в соответствии с rustc 1.0.0-nightly.

Также стоит отметить, что компилятор не может устранить неоднозначность, когда вы используете идентификатор в диапазоне (например, * 1006).*) так что вы должны использовать for i in (0..a), но есть запрос на получение , поданный, чтобы исправить это.

2 голосов
/ 31 октября 2012

Обратите внимание, что начиная с rustc 0.4 (октябрь 2012 г.), альтернативная конструкция

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}

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

0 голосов
/ 14 февраля 2012

Использование int :: range .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...