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()); }