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`에는 이러한 것들이 없습니다.
}