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