Option
때로는 프로그램의 일부에서 발생하는 실패를 panic!을 호출하는 대신 포착하고 싶을 때가 있습니다. 이는 Option 열거형을 사용하여 수행할 수 있습니다.
Option<T> 열거형은 두 가지 변체를 가집니다:
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` 값은 다른 열거형과 마찬가지로 패턴 매칭될 수 있습니다
match checked_division(dividend, divisor) {
None => println!("{} / {} 실패!", 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` 변체의 래핑을 해제(unwrap)하면 감싸진 값을 추출합니다.
println!("{:?}의 래핑을 해제하면 {:?}가 됩니다", optional_float, optional_float.unwrap());
// `None` 변체의 래핑을 해제하면 `panic!`이 발생합니다
println!("{:?}의 래핑을 해제하면 {:?}가 됩니다", none, none.unwrap());
}