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 :)!"); }; }