Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

while let

if let과 유사하게, while let은 어색한 match 시퀀스를 더 견딜만하게 만들어 줍니다. i를 증가시키는 다음 시퀀스를 고려해 보세요:

#![allow(unused)]
fn main() {
// `Option<i32>` 타입의 `optional` 생성
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() {
    // `Option<i32>` 타입의 `optional` 생성
    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`에는 이러한 것들이 없습니다.
}

참고:

enum, Option, 그리고 RFC