问号运算符 (?) 在 Rust 中有什么作用,它如何处理错误?
大家好!我是 Rust 新手,正在尝试理解错误处理。我经常在别人的代码中看到一个奇怪的问号运算符 — `?`。例如,像这样的代码:
```rust
use std::fs::File;
use std::io::Read;
fn read_file(path: &str) -> Result {
let mut file = File::open(path)?;
let mut content = String::new();
file.read_to_string(&mut content)?;
Ok(content)
}
```
我知道 `File::open` 返回一个 `Result`,但行尾的这个 `?` 是做什么的?没有它,编译器会报错说我没有处理 `Result`。但如果我加上 `?`,代码就能工作。
我试过阅读文档,但写得太复杂了。你能用简单的话解释一下:这个神奇的问号是什么?它和 `unwrap()` 或 `match` 有关吗?为什么函数返回 `Result`,但在函数体内我可以使用 `?` 而不必为每个调用写 match?
让我困惑的例子是:如果我把 `?` 替换成 `.unwrap()`,代码也能工作,但出错时程序会崩溃。