07-丑陋的 Option/Result 处理

丑陋的 Option/Result 处理 — Rust 语言之旅

内容来源 · Tour of Rust / Rust 语言之旅

原文链接: https://tourofrust.com/39_zh-cn.html

丑陋的 Option/Result 处理

当你只是试图快速地写一些代码时,Option/Result 对付起来可能比较无聊。 Option 和 Result 都有一个名为 unwrap 的函数:这个函数可以简单粗暴地获取其中的值。 unwrap 会:

  1. 获取 Option/Result 内部的值
  2. 如果枚举的类型是 None/Err, 则会 panic!

这两段代码是等价的:

my_option.unwrap()
match my_option {
    Some(v) => v,
    None => panic!("some error message generated by Rust!"),
}

类似的:

my_result.unwrap()
match my_result {
    Ok(v) => v,
    Err(e) => panic!("some error message generated by Rust!"),
}

不过啊,做个好 Rustacean,正确地使用 match!

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
fn do_something_that_might_fail(i: i32) -> Result<f32, String> {
    if i == 42 {
        Ok(13.0)
    } else {
        Err(String::from("this is not the right number"))
    }
}

fn main() -> Result<(), String> {
    // 简洁但假设性强,而且很快就会变得丑陋
    let v = do_something_that_might_fail(42).unwrap();
    println!("found {}", v);
    
    // 这会 panic!
    let v = do_something_that_might_fail(1).unwrap();
    println!("found {}", v);
    
    Ok(())
}
最后修改 August 21, 2026: 更新 (76fc81a2e)