Циклы в Rust
Помимо гибких условных операторов, конструкции циклов в Rust также очень хорошо продуманы. Как закалённый в боях разработчик, вы должны это почувствовать.
цикл while
Цикл while — наиболее типичный условный цикл:
Пример
let mut number = 1;
while number != 4 {
println!("{}", number);
число += 1;
}
println!("EXIT");
}
Вывод:
1 2 3 EXIT
На момент написания этого руководства в Rust нет конструкции do-while, но `do` указано как зарезервированное слово и может быть использовано в будущих версиях.
В C цикл for использует выражение из трёх частей для управления циклом, но в Rust такой конструкции нет, поэтому вместо него приходится использовать цикл while:
Язык C
for (i = 0; i < 10; i++) {
// тело цикла
}
Rust
while i < 10 {
// тело цикла
i += 1;
}
цикл for
Цикл for — наиболее часто используемая конструкция цикла, часто применяется для перебора линейной структуры данных (например, массива). Цикл for перебирает массив:
Пример
let a = [10, 20, 30, 40, 50];
for i in a.iter() {
println!("Value is: {}", i);
}
}
Вывод:
值为 : 10 值为 : 20 值为 : 30 值为 : 40 值为 : 50
Цикл for в этой программе перебирает массив a. `a.iter()` представляет итератор a; мы не будем вдаваться в подробности до изучения объектов.
Конечно, цикл for также может обращаться к массиву по индексу:
Пример
let a = [10, 20, 30, 40, 50];
for i in 0..5 {
println!("a[{}] = {}", i, a[i]);
}
}
Вывод:
a[0] = 10 a[1] = 20 a[2] = 30 a[3] = 40 a[4] = 50
loop Цикл
Опытные разработчики наверняка сталкивались с ситуациями, когда цикл не может определить в начале или в конце, продолжать ли выполнение, и выполнение цикла должно контролироваться где-то в середине тела цикла. В таких случаях мы часто реализуем досрочный выход из цикла внутри цикла `while (true)`.
В Rust есть встроенная конструкция бесконечного цикла — `loop`:
Пример
let s = ['R', 'U', 'N', 'O', 'O', 'B'];
let mut i = 0;
loop {
let ch = s[i];
if ch == 'O' {
break;
}
println!("\'{}\'", ch);
i += 1;
}
}
Вывод:
'R' 'U' 'N'
Цикл `loop` может использовать ключевое слово `break`, подобно `return`, чтобы выйти из всего цикла и передать возвращаемое значение наружу. Это очень остроумный дизайн, потому что цикл `loop` часто используется как инструмент поиска; если что-то найдено, конечно, результат следует вернуть:
Пример
let s = ['R', 'U', 'N', 'O', 'O', 'B'];
let mut i = 0;
let location = loop {
let ch = s[i];
if ch == 'O' {
break i;
}
i += 1;
};
println!(" \'O\''s index is {}", location);
}
Вывод:
'O' 的索引为 3Другие расширения