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`은 필요치 않음. }