|
|
|
@ -120,7 +120,7 @@ fn value_in_cents(coin: Coin) -> u32 {
|
|
|
|
|
|
|
|
|
|
### 匹配 `Option<T>`
|
|
|
|
|
|
|
|
|
|
在之前的部分在使用 `Option<T>` 时我们想要从 `Some` 中取出其内部的 `T` 值;也可以像处理 `Coin` 枚举那样使用 `match` 处理 `Option<T>`!与其直接比较硬币,我们将比较 `Option<T>` 的成员,不过 `match` 表达式的工作方式保持不变。
|
|
|
|
|
我们在之前的部分中使用 `Option<T>` 时,是为了从 `Some` 中取出其内部的 `T` 值;我们还可以像处理 `Coin` 枚举那样使用 `match` 处理 `Option<T>`!与其直接比较硬币,我们将比较 `Option<T>` 的成员,不过 `match` 表达式的工作方式保持不变。
|
|
|
|
|
|
|
|
|
|
比如我们想要编写一个函数,它获取一个 `Option<i32>` 并且如果其中有一个值,将其加一。如果其中没有值,函数应该返回 `None` 值并不尝试执行任何操作。
|
|
|
|
|
|
|
|
|
@ -143,7 +143,7 @@ let none = plus_one(None);
|
|
|
|
|
|
|
|
|
|
#### 匹配 `Some(T)`
|
|
|
|
|
|
|
|
|
|
让我们更仔细的检查 `plus_one` 的第一行操作。当调用 `plus_one(five)` 时,`plus_one` 函数体中的 `x` 将会是值 `Some(5)`。接着将其与每个分支比较。
|
|
|
|
|
让我们更仔细地检查 `plus_one` 的第一行操作。当调用 `plus_one(five)` 时,`plus_one` 函数体中的 `x` 将会是值 `Some(5)`。接着将其与每个分支比较。
|
|
|
|
|
|
|
|
|
|
```rust,ignore
|
|
|
|
|
None => None,
|
|
|
|
@ -191,7 +191,7 @@ error[E0004]: non-exhaustive patterns: `None` not covered
|
|
|
|
|
| ^ pattern `None` not covered
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Rust 知道我们没有覆盖所有可能的情况甚至知道那些模式被忘记了!Rust 中的匹配是 **穷尽的**(*exhaustive*):必须穷举到最后的可能性来使代码有效。特别的在这个 `Option<T>` 的例子中,Rust 防止我们忘记明确的处理 `None` 的情况,这使我们免于假设拥有一个实际上为空的值,这造成了之前提到过的价值亿万的错误。
|
|
|
|
|
Rust 知道我们没有覆盖所有可能的情况甚至知道哪些模式被忘记了!Rust 中的匹配是 **穷尽的**(*exhaustive*):必须穷举到最后的可能性来使代码有效。特别的在这个 `Option<T>` 的例子中,Rust 防止我们忘记明确的处理 `None` 的情况,这使我们免于假设拥有一个实际上为空的值,这造成了之前提到过的价值亿万的错误。
|
|
|
|
|
|
|
|
|
|
### `_` 通配符
|
|
|
|
|
|
|
|
|
|