while let

Tương tự như if let, while let cũng có thể khiến một chuỗi match rườm rà trở nên đẹp hơn. Hãy xem xét trình tăng dần i bên dưới:

#![allow(unused)]
fn main() {
// Biến `optional` có kiểu `Option<i32>`
let mut optional = Some(0);

// Lặp đi lặp lại test này.
loop {
    match optional {
        // Nếu `optional` được destructure, khối lệnh sau sẽ được dùng.
        Some(i) => {
            if i > 9 {
                println!("Greater than 9, quit!");
                optional = None;
            } else {
                println!("`i` is `{:?}`. Try again.", i);
                optional = Some(i + 1);
            }
            // ^ Yêu cầu 3 lần thụt đầu dòng!
        },
        // Thoát vòng lặp nếu việc tách dữ liệu thất bại:
        _ => { break; }
        // ^ Dòng cuối này có vẻ thừa thãi nhưng lại bắt buộc phải có. Cần có một cách tốt hơn!
    }
}
}

Sử dụng while let sẽ giúp chuỗi lặp match trên gọn gàng hơn:

fn main() {
    // Biến `optional` có kiểu `Option<i32>`
    let mut optional = Some(0);

    // Cấu trúc `white let` được dùng như sau: "while `let` sẽ destructure `optional` thành
    // `Some(i)`, đánh giá trong các block (`{}`).
    while let Some(i) = optional {
        if i > 9 {
            println!("Greater than 9, quit!");
            optional = None;
        } else {
            println!("`i` is `{:?}`. Try again.", i);
            optional = Some(i + 1);
        }
        // ^ Ít thụt đầu dòng hơn `if let` và cũng 
        // không đòi hỏi xử lý trường hợp failure.
    }
    // ^ `if let` có tuỳ chọn bổ sung thêm `else`/`else if`. 
    // Nhưng `while let` không có và không cần điều này.
}

Xem thêm tại đây:

enum, Option, và white let RFC