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

See also:

enum, Option, and the RFC

results matching ""

    No results matching ""