7.7 while let

if let과 유사하게, while letmatch흐름의 부조화를 참을만하게 만들어준다. i를 증가시키는 다음 흐름을 살펴보자:

// `Option<i32>` 타입의 `optional` 생성
let mut optional = Some(0);

// 반복해서 이 테스트를 수행. 
loop {
    match optional {
        // `optional`이 역구조화 되면, 블럭을 수행.
        Some(i) => {
            if i > 9 {
                println!("Greater than 9, quit!");
                optional = None;
            } else {
                println!("`i` is `{:?}`. Try again.", i);
                optional = Some(i + 1);
            }
            // ^ 3 들여쓰기 필요!
        },
        // 역구조화에 실패하면 루프 탈출:
        _ => { break; }
        // ^ 이게 필요한 이유가 뭐지? 더 나은 방법이 있을거야!
    }
}

while let을 사용하면 이 흐름은 훨씬 보기 좋다:

fn main() {
    // `Option` 타입의 `optional` 생성
    let mut optional = Some(0);

    // 읽는 방법: "`let`으로 `optional`을 `Some(i)`로 역구조화 되는 동안
    // 블럭을 수행 (`{}`). 아니면 `break`.
    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);
        }
        // ^ 더 적은 오른쪽 들여쓰기, 실폐의 경우에 대한 명시적 처리가 필요하지 않다.
    }
    // ^ `if let`은 추가로 부수적 `else`/`else if`절을 갖지만
    // `while let`은 필요치 않음.
}

See also:

enum, Option, and the RFC

results matching ""

    No results matching ""