17.4 Option

때로는 panic!의 호출 대신 프로그램의 일부인 실패를 잡는 것이 바람직하다; 이는 Option enum을 사용하여 성취될 수 있다.

Option<T> enum 은 두 형태를 갖는다:

  • None, 실패 혹은 값이 부족한 경우를 나타낸다.
  • Some(value), 타입 T로 포장된 value인 튜플 구조체
// `panic!`하지 않는 정수 분할
fn checked_division(dividend: i32, divisor: i32) -> Option<i32> {
    if divisor == 0 {
        // 실패는 `None`의 형태로 표현된다.
        None
    } else {
        // `Some`의 형태로 포장된 결과.
        Some(dividend / divisor)
    }
}

// 이 함수는 성공하지 못할 수 있는 분할을 처리한다.
fn try_division(dividend: i32, divisor: i32) {
    // `Option`값은 다른 enum과 마찬가지로 패턴 매칭 될 수 있다.
    match checked_division(dividend, divisor) {
        None => println!("{} / {} failed!", dividend, divisor),
        Some(quotient) => {
            println!("{} / {} = {}", dividend, divisor, quotient)
        },
    }
}

fn main() {
    try_division(4, 2);
    try_division(1, 0);

    // 변수에 `None`을 바인딩 하려면 타입 주해가 필요하다.
    let none: Option<i32> = None;
    let _equivalent_none = None::<i32>;

    let optional_float = Some(0f32);

    // `Some`형을 언래핑하면 래핑됐던 값이 추출되게 된다.
    println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());

    // `None` 형을 언래핑하면 `panic!`된다.
    println!("{:?} unwraps to {:?}", none, none.unwrap());
}

results matching ""

    No results matching ""