mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-08 16:21:19 +08:00
Merge branch 'master' of https://github.com/KaiserY/trpl-zh-cn
This commit is contained in:
commit
4bdd615d25
@ -4,7 +4,7 @@
|
|||||||
> <br>
|
> <br>
|
||||||
> commit b18f90970ab7223ee8af18ef466a5ba6ff8482ef
|
> commit b18f90970ab7223ee8af18ef466a5ba6ff8482ef
|
||||||
|
|
||||||
**状态模式**(*state pattern*)是一个面向对象设计模式。改模式的关键在于一个值有某些内部状态,体现为一系列的 **状态对象**,同时值的行为随着其内部状态而改变。状态对象共享功能 ———— 当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象代表负责其自身的行为和当需要改变为另一个状态时的规则的状态。持有任何一个这种状态对象的值对于不同状态的行为以及何时状态转移毫不知情。
|
**状态模式**(*state pattern*)是一个面向对象设计模式。该模式的关键在于一个值有某些内部状态,体现为一系列的 **状态对象**,同时值的行为随着其内部状态而改变。状态对象共享功能 —— 当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象代表负责其自身的行为和当需要改变为另一个状态时的规则的状态。持有任何一个这种状态对象的值对于不同状态的行为以及何时状态转移毫不知情。
|
||||||
|
|
||||||
<!-- Below -- requirements for what, for what we need the value for? -->
|
<!-- Below -- requirements for what, for what we need the value for? -->
|
||||||
<!-- I've clarified /Carol -->
|
<!-- I've clarified /Carol -->
|
||||||
@ -58,11 +58,11 @@ line, not sure if that's accurate though -->
|
|||||||
<!-- Yes, the state pattern will be implemented within the `Post` type. I've
|
<!-- Yes, the state pattern will be implemented within the `Post` type. I've
|
||||||
tweaked the wording a bit but you've pretty much got it! /Carol-->
|
tweaked the wording a bit but you've pretty much got it! /Carol-->
|
||||||
|
|
||||||
注意我们与 crate 交互的唯一的类型是 `Post`。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 ———— 草案,等待审核和发布。状态上的改变由 `Post` 类型内部进行管理。状态依库用户对 `Post` 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。
|
注意我们与 crate 交互的唯一的类型是 `Post`。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 —— 草案,等待审核和发布。状态上的改变由 `Post` 类型内部进行管理。状态依库用户对 `Post` 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。
|
||||||
|
|
||||||
### 定义 `Post` 并新建一个草案状态的实例
|
### 定义 `Post` 并新建一个草案状态的实例
|
||||||
|
|
||||||
让我们开始实现这个库吧!我们知道需要一个公有 `Post` 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 `Post` 实例的公有关联函数 `new` 开始,如示例 17-12 所示。还需定义一个私有 trait `State`。`Post` 将在私有字段 `state` 中存放一个 `Option` 中的 trait 对象 `Box<State>`。稍后将会看到为何 `Option` 是必须的。
|
让我们开始实现这个库吧!我们知道需要一个公有 `Post` 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 `Post` 实例的公有关联函数 `new` 开始,如示例 17-12 所示。还需定义一个私有 trait `State`。`Post` 将在私有字段 `state` 中存放一个 `Option` 类型的 trait 对象 `Box<State>`。稍后将会看到为何 `Option` 是必须的。
|
||||||
|
|
||||||
`State` trait 定义了所有不同状态的博文所共享的行为,同时 `Draft`、`PendingReview` 和 `Published` 状态都会实现 `State` 状态。现在这个 trait 并没有任何方法,同时开始将只定义 `Draft` 状态因为这是我们希望博文的初始状态:
|
`State` trait 定义了所有不同状态的博文所共享的行为,同时 `Draft`、`PendingReview` 和 `Published` 状态都会实现 `State` 状态。现在这个 trait 并没有任何方法,同时开始将只定义 `Draft` 状态因为这是我们希望博文的初始状态:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ match VALUE {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
`match` 表达式必须是 **穷尽**(*exhaustive*)的,意为 `match` 表达式所有可能的值都必须被考虑到。一个确保覆盖每个可能值的方法是在最后一个分支使用捕获所有的模式 ———— 比如,一个匹配任何值的名称永远也不会失败,因此可以覆盖所有匹配剩下的情况。
|
`match` 表达式必须是 **穷尽**(*exhaustive*)的,意为 `match` 表达式所有可能的值都必须被考虑到。一个确保覆盖每个可能值的方法是在最后一个分支使用捕获所有的模式 —— 比如,一个匹配任何值的名称永远也不会失败,因此可以覆盖所有匹配剩下的情况。
|
||||||
|
|
||||||
有一个特定的模式 `_` 可以匹配所有情况,不过它从不绑定任何变量。这在例如希望忽略任何未指定值的情况很有用。本章之后会详细讲解。
|
有一个特定的模式 `_` 可以匹配所有情况,不过它从不绑定任何变量。这在例如希望忽略任何未指定值的情况很有用。本章之后会详细讲解。
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ in the Rust sense? -->
|
|||||||
|
|
||||||
### `while let` 条件循环
|
### `while let` 条件循环
|
||||||
|
|
||||||
一个与 `if let` 结构类似的是 `while let` 条件循环,它允许只要模式匹配就一直进行 `while` 循环。示例 18-2 展示了一个使用 `while let` 的例子,它使用 vector 作为栈并打以先进后出的方式打印出 vector 中的值:
|
一个与 `if let` 结构类似的是 `while let` 条件循环,它允许只要模式匹配就一直进行 `while` 循环。示例 18-2 展示了一个使用 `while let` 的例子,它使用 vector 作为栈并以先进后出的方式打印出 vector 中的值:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
let mut stack = Vec::new();
|
let mut stack = Vec::new();
|
||||||
|
Loading…
Reference in New Issue
Block a user