|
|
|
@ -246,7 +246,7 @@ fn read_username_from_file() -> Result<String, io::Error> {
|
|
|
|
|
|
|
|
|
|
从文件读取数据到字符串中,是比较常见的操作,因此 Rust 标准库为我们提供了 `fs::read_to_string` 函数,该函数内部会打开一个文件、创建 `String`、读取文件内容最后写入字符串并返回,因为该函数其实与本章讲的内容关系不大,因此放在最后来讲,其实只是我想震你们一下 :)
|
|
|
|
|
|
|
|
|
|
#### ?用于Option的返回
|
|
|
|
|
#### ? 用于Option的返回
|
|
|
|
|
`?` 不仅仅可以用于 `Result` 的传播,还能用于 `Option` 的传播,再来回忆下 `Option` 的定义:
|
|
|
|
|
```rust
|
|
|
|
|
pub enum Option<T> {
|
|
|
|
@ -285,7 +285,7 @@ fn first(arr: &[i32]) -> Option<&i32> {
|
|
|
|
|
arr.get(0)?
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
这段代码无法通过编译,切记:`?` 操作符需要一个变量来承载正确的值,只有错误值能直接返回,正确的值不行。因此 `?` 只能用于以下形式:
|
|
|
|
|
这段代码无法通过编译,切记:`?` 操作符需要一个变量来承载正确的值,这个函数只会返回 `Some(&i32)` 或者 `None`,只有错误值能直接返回,正确的值不行,所以如果数组中存在 0 号元素,那么函数第二行使用 `?` 后的返回类型为 `&i32` 而不是 `Some(&i32)`。因此 `?` 只能用于以下形式:
|
|
|
|
|
- `let v = xxx()?;`
|
|
|
|
|
- `xxx()?.yyy()?;`
|
|
|
|
|
|
|
|
|
|