mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2024-12-25 20:30:34 +08:00
Refined Ch06.
This commit is contained in:
parent
29509e54da
commit
842bcc2937
@ -32,46 +32,51 @@
|
||||
```
|
||||
|
||||
|
||||
语法 `if let` 取以等号分隔的一个模式和表达式。其工作原理与 `match` 表达式相同,`if let` 中的表达式,会被给到 `match`,而其中的模式,便是 `match` 的首个支臂。在本例中,模式为 `Some(max)`,`max` 会绑定大 `Some` 中的值。我们随后便可以在 `if let` 代码块的正文中,以咱们曾在对应的 `match` 支臂中使用 `max` 的同样方式,使用 `max` 了。如果值与模式不匹配,就不会运行这个 `if let` 代码块中的代码。
|
||||
语法 `if let` 取以等号分隔的一个模式和表达式。其工作原理与 `match` 表达式相同,`if let` 中的表达式,会被给到 `match`,而其中的模式,便是 `match` 的首个支臂。在本例中,模式为 `Some(max)`,`max` 会绑定大 `Some` 中的值。我们随后便可以在 `if let` 代码块的正文中,以咱们曾在对应的 `match` 支臂中使用 `max` 的同样方式,使用 `max` 了。如果值与模式不匹配,这个 `if let` 代码块中的代码就不会运行。
|
||||
|
||||
|
||||
> **译注**:`if let` 实际上是两部分,其中 `let Some(max) = config_max` 是个检验表达式 scrutinee expression。后面会看到类似的 `while let` 语法。
|
||||
|
||||
|
||||
使用 `if let` 语法,就意味着较少输入、较少的缩进,以及更少的样板代码。不过会损失 `match` 表达式强制要求的穷尽检查。是根据特定情形下,手头正在做的事情,在 `match` 表达式与 `if let` 语法之间加以选择的,以及考量为收获到简洁,而是否值得损失穷尽性检查。
|
||||
使用 `if let`,意味着更少输入、更少缩进和更少模板代码。但是,咱们会失去 `match` 表达式所带来的穷尽检查。在 `match` 和 `if let` 之间做出选择,取决于咱们在咱们的特定情况下,正在做什么;以及在失去穷尽检查的同时,是否能获得了简洁性。
|
||||
|
||||
也就是说,可将 `if let` 语法当作,在值与某个模式匹配时运行代码,并在之后忽略所有其他值的 `match` 表达式的语法糖(in other words, you can think of `if let` as syntax sugar for a `match` that runs code when the value matches one pattern and then ignores all other values)。
|
||||
换句话说,咱们可以把 `if let`,视为在值与一种模式匹配时执行代码,并在随后忽略所有其他值的 `match` 表达式的语法糖。
|
||||
|
||||
我们可以在 `if let` 中加入一个 `else`。与 `else` 搭配的代码块,与等同于这个 `if let` 与 `else` 的 `match` 表达式中,`_` 情况下的代码块相同。回想清单 6-4 中的 `Coin` 枚举定义,其中 `Quarter` 变种还包含了一个 `UsState` 值。如果我们想清点我们见到的所有非 25 美分硬币,同时还要公布 25 美分硬币的州份,我们本可以使用一个 `match` 表达式来完成这点,就像下面这样:
|
||||
|
||||
这里可以在 `if let` 之下,包含一个 `else` 关键字。`else` 所带的代码块,与在和 `if let` 及 `else` 等价的 `match` 表达式中, `_` 情形所带代码块相同。回想起清单 6-4 中的那个 `Coin` 枚举定义,其中的 `Quarter` 变种还有一个 `UsState` 值。在要通告出那些 25 美分硬币的州份的同时,还要清点出找到的全部非 25 美分数目,那么就可以使用下面这样的 `match` 表达式:
|
||||
|
||||
```rust
|
||||
let mut count = 0;
|
||||
|
||||
match coin {
|
||||
Coin::Quarter(state) => println! ("这是来自州份 {:?} 的 25 美分硬币!", state),
|
||||
Coin::Quarter(state) => println! ("State quarter from {:?}!", state),
|
||||
_ => count += 1,
|
||||
}
|
||||
```
|
||||
|
||||
或者这里还可以使用一个像下面这样的 `if let` 与 `else` 的表达式:
|
||||
|
||||
或者,我们可以使用 `if let` 和 `else` 表达式,就像这样:
|
||||
|
||||
|
||||
```rust
|
||||
let mut count = 0;
|
||||
|
||||
if let Coin::Quarter(state) = coin {
|
||||
println! ("这是来自州份 {:?} 的 25 美分硬币!", state);
|
||||
println! ("State quarter from {:?}!", state);
|
||||
} else {
|
||||
count += 1;
|
||||
}
|
||||
```
|
||||
|
||||
在遇到程序中使用 `match` 显得太过繁复的逻辑这样情形时,就要记住在 Rust 工具箱中还有 `if let`语法呢。
|
||||
|
||||
如果咱们遇到咱们的程序中,有着使用 `match` 表示表达显得过于冗长的逻辑,那么请记住,`if let` 也在 Rust 工具箱中。
|
||||
|
||||
|
||||
# 总结
|
||||
# 本章小结
|
||||
|
||||
本章已经讲过,怎样运用枚举,来创建可作为一套一一列出数值之一的定制类型。这里给出了标准库的 `Option<T>` 类型,是怎样在运用该类型下,防止代码错误的原理。在枚举值有着内部值时,根据所要处理的多少种情况,而可使用 `match` 表达式或 `if let` 语法,来提取并使用这些值。
|
||||
|
||||
现在的 Rust 程序,就可以使用结构体与枚举,对所在领域的那些概念加以表达了。通过在自己构建的 API 使用的定制类型,而确保了类型安全:Rust 编译器将令到 API 中的那些函数,只获取到这些函数所期望类型的那些值。
|
||||
现在我们已经介绍了如何使用枚举来创建出,可以是一组枚举值中的一个的自定义类型。我们已经展示了标准库的 `Option<T>` 类型,如何帮助咱们使用类型系统,来防止错误。当枚举值中包含数据时,根据咱们需要处理多少种情况,咱们可以使用 `match` 或 `if let`,来提取和使用这些值。
|
||||
|
||||
而为了将可直接使用上的、组织良好的 API 提供到用户,并只暴露 API 的用户所需要部分,那么就要了解一下 Rust 的模组特性了。
|
||||
咱们的 Rust 程序现在可以使用结构体和枚举,来表达咱们领域中的概念了。在咱们的 API 中创建一些自定义类型,确保了类型安全:编译器将确保咱们的函数,只获取到每个他们所期望类型的值。
|
||||
|
||||
为了向咱们的用户,提供组织良好、简单易用的 API,并且只暴露出咱们用户所需的内容,我们现在来看看 Rust 的模组。
|
||||
|
Loading…
Reference in New Issue
Block a user