• 选项 Option

    选项 Option

    有时候想要捕捉到程序某部分的失败信息,而不调用 panic!;这可使用 Option 枚举来完成。

    Option<T> 枚举有两个变量:

    • None,表明失败或缺少值
    • Some(value),元组结构体,使用 T 类型装包了一个值 value
    1. // 不会 `panic!` 的整数除法。
    2. fn checked_division(dividend: i32, divisor: i32) -> Option<i32> {
    3. if divisor == 0 {
    4. // 失败表示成 `None` 变量
    5. None
    6. } else {
    7. // 结果 Result 被装包成 `Some` 变量
    8. Some(dividend / divisor)
    9. }
    10. }
    11. // 此函数处理可能失败的除法
    12. fn try_division(dividend: i32, divisor: i32) {
    13. // `Option` 值可以进行模式匹配,就和其他枚举一样
    14. match checked_division(dividend, divisor) {
    15. None => println!("{} / {} failed!", dividend, divisor),
    16. Some(quotient) => {
    17. println!("{} / {} = {}", dividend, divisor, quotient)
    18. },
    19. }
    20. }
    21. fn main() {
    22. try_division(4, 2);
    23. try_division(1, 0);
    24. // 绑定 `None` 到一个变量需要类型标注
    25. let none: Option<i32> = None;
    26. let _equivalent_none = None::<i32>;
    27. let optional_float = Some(0f32);
    28. // 解包 `Some` 变量将展开解包后的值。
    29. // (原文:Unwrapping a `Some` variant will extract the value wrapped.)
    30. println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());
    31. // 解包 `None` 变量将会引发 `panic!`。
    32. println!("{:?} unwraps to {:?}", none, none.unwrap());
    33. }