选项 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 { // 结果 Result 被装包成 `Some` 变量 Some(dividend / divisor) } } // 此函数处理可能失败的除法 fn try_division(dividend: i32, divisor: i32) { // `Option` 值可以进行模式匹配,就和其他枚举一样 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` 变量将展开解包后的值。 // (原文:Unwrapping a `Some` variant will extract the value wrapped.) println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap()); // 解包 `None` 变量将会引发 `panic!`。 println!("{:?} unwraps to {:?}", none, none.unwrap()); }