7.7 while let
if let과 유사하게, while let은 match흐름의 부조화를 참을만하게 만들어준다. 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`은 필요치 않음.
}