7.6 if let
경우에 따라서 match를 적용하기 어려울 때가 있다. 예를 들어:
// 타입 `Option<i32>`인 `optional` 생성
let optional = Some(7);
match optional {
Some(i) => {
println!("This is a really long string and `{:?}`", i);
// ^ 2번 들여쓰기 하고 나서야 `i`를 option에서 역구조화 할 수 있다.
},
_ => {},
// ^ `match`가 완벽해야 하기 때문에 필요하다. 공간 낭비 같지 않는가?
};
if let은 이런 경우에 사용될 수 있고 추가로 다양한 실패 옵션을 열거할 수 있다.
fn main() {
// 모든 타입이 `Option`
let number = Some(7);
let letter: Option<i32> = None;
let emoticon: Option<i32> = None;
// `if let` 구문을 읽는 법:"if(만약) `let`으로 `number`를
// 역구조화해 `Some(i)`에 넣고, 그에 따른 블럭 (`{}`) 수행.
if let Some(i) = number {
println!("Matched {:?}!", i);
}
// 실패에 대한 기재가 필요할 경우, else를 사용하라:
if let Some(i) = letter {
println!("Matched {:?}!", i);
} else {
// 역구조화가 실패했다. 실패 사례로 변경.
println!("Didn't match a number. Let's go with a letter!");
};
// 변경된 실패 상태를 제공.
let i_like_letters = false;
if let Some(i) = emoticon {
println!("Matched {:?}!", i);
// 역구조화에 실패했다. `else if` 조건의 평가에 따라
// 대체 실패 분기가 취해질 것이다.
} else if i_like_letters {
println!("Didn't match a number. Let's go with a letter!");
} else {
// 조건이 false로 판단됐다. 이 분기가 기본이다:
println!("I don't like letters. Let's go with an emoticon :)!");
};
}