Введение
В этом лабе демонстрируется использование while let в Rust в качестве более компактного и эффективного альтернативы использованию последовательностей match при инкрементировании переменных или итерировании по типам Option.
Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
while let
Похожий на if let, while let может сделать неудобные последовательности match более терпимыми. Рассмотрим следующую последовательность, которая инкрементирует i:
// Создаем `optional` типа `Option<i32>`
let mut optional = Some(0);
// Повторно выполняем этот тест.
loop {
match optional {
// Если `optional` разбивается, выполняем блок.
Some(i) => {
if i > 9 {
println!("Больше 9, выходим!");
optional = None;
} else {
println!("`i` равно `{:?}`. Попробуйте снова.", i);
optional = Some(i + 1);
}
// ^ Требует 3 отступа!
},
// Завершаем цикл, когда разбиение неудачно:
_ => { break; }
// ^ Почему это должно быть обязательно? Должен быть лучший способ!
}
}
Использование while let делает эту последовательность гораздо приятнее:
fn main() {
// Создаем `optional` типа `Option<i32>`
let mut optional = Some(0);
// Это читается так: "пока `let` разбивает `optional` на
// `Some(i)`, выполняем блок (`{}`). В противном случае `break`.
while let Some(i) = optional {
if i > 9 {
println!("Больше 9, выходим!");
optional = None;
} else {
println!("`i` равно `{:?}`. Попробуйте снова.", i);
optional = Some(i + 1);
}
// ^ Менее往右 сдвиг и не требует явной обработки
// неудачного случая.
}
// ^ `if let` имел дополнительные необязательные `else`/`else if`
// условия. `while let` не имеет этих.
}
Резюме
Поздравляем! Вы завершили лабу по While Let. Вы можете практиковаться в более лабах в LabEx, чтобы улучшить свои навыки.