Концизительная итерация Option в Rust с использованием while let

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом лабе демонстрируется использование 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, чтобы улучшить свои навыки.