Update Ch15

This commit is contained in:
Unisko PENG 2023-05-11 15:25:21 +08:00
parent 5b4c6d8b1a
commit 3e4888f124
2 changed files with 6 additions and 10 deletions

View File

@ -53,11 +53,7 @@ mod tests {
impl Messenger for MockMessenger {
fn send(&self, message: &str) {
let mut borrow_one = self.sent_messages.borrow_mut();
let mut borrow_two = self.sent_messages.borrow_mut();
borrow_one.push(String::from(message));
borrow_two.push(String::from(message));
self.sent_messages.borrow_mut().push(String::from(message));
}
}

View File

@ -850,7 +850,7 @@ Rust 没有像其他语言那样拥有对象Rust 也没有像其他一些语
这段代码的一个重要部分是 `Messenger` 特质有个叫做 `send` 的方法,其接收一个不可变 `self` 的引用和消息文本。这个特质是咱们模拟对象需要实现的接口,这样模拟对象就可以和真实对象一样被使用。另一个重要的部分是,我们要测试 `LimitTracker``set_value` 方法的行为。我们可以改变我们传入的 `value` 参数,但 `set_value` 并没有返回任何东西让我们做断言。我们希望能够表达出,若咱们用实现了 `Messenger` 特质的东西,与 `max` 的一个特定值创建了一个 `LimitTracker`,当我们为 `value` 传递不同的数字时,`messenger` 就会被告知要发送相应的消息。
> 注the interface, 借鉴了 Java 语言的叫法,参见 [使用接口来拯救!](https://java.xfoss.com/ji-cheng-he-duo-tai-ji-zhi/ch08_interfaces_and_abstract_classes#interface_rescue)。
> 注the interface, 借鉴了 Java 语言的叫法,参见 [使用接口来拯救!](https://java.xfoss.com/ji-cheng-he-duo-tai-ji-zhi/ch08_interfaces_and_abstract_classes#interface_rescue)。而这种内部可变性模式用到的数据结构,则类似于 Java 中的内部类。
我们需要一个模拟对象,他不会在我们调用 `send` 时发送电子邮件或文本消息,而只会记录他被告知要发送的消息。我们可以创建模拟对象的一个新实例,创建一个使用该模拟对象的 `LimitTracker` 实例,调用 `LimitTracker` 实例的 `set_value` 方法,然后检查该模拟对象是否有我们期望的消息。清单 15-21 给出了一个实现模拟对象的尝试,来就这样做,但借用检查器不允许这样做:
@ -893,14 +893,14 @@ mod tests {
*清单 15-21试图实现一个借用检查器不允许的 `MockMessenger`*
此测试代码定义了有着一个 `sent_messages` 字段的 `MockMessenger` 结构体,该字段有着用于跟踪其被告知要发送消息的一些 `String` 值的 `Vec` 类型变量。这里还定义了一个关联函数 `new`,来令到创建出以空消息清单开头的那些新 `MockMessenger` 类型值,便利起来。随后这里就为 `MockMessenger` 实现了那个 `Messenger` 特质,于是就可以将某个 `MockMessenger` 给到一个 `LimitTracker` 了。在那个 `send` 方法的定义中,这里将所传入的消息,取作了参数,并将其存储在 `MockMessenger``sent_messages` 清单中。
这段测试代码定义了一个 `MockMessenger` 结构体,他有一个 `send_messages` 字段,里面有一个 `String` 值的 `Vec`,用来记录他被告知要发送的消息。我们还定义了一个关联函数 `new`,以方便创建新的 `MockMessenger` 值,该值以一个空的消息列表开始。然后我们为 `MockMessenger` 实现了 `Messenger` 特质,这样我们就可以给 `LimitTracker` 一个 `MockMessenger`。在 `send` 方法的定义中,我们将传入的消息作为参数,并将其存储在 `MockMessenger``send_messages` 列表中。
那个测试中,所测试的是,当其中的 `LimitTracker` 被告知要将 `value`,设置为大于其中的 `max` 值的某个值时,会发生什么事情。首先,这里创建出了一个新的 `MockMessage`,他将以一个空的消息清单开始。随后这里创建了一个新的 `LimitTracker`,并给到他了到那个新 `MockMessenger` 的引用,以及 `100``max` 值。这里以值 `80` 调用了 `LitmitTracker` 上的 `set_value` 方法,而该值是大于 `75` 小于 `100` 的。随后这里断言了 `MockMessenger` 正追踪的那个消息清单,现在应有一条消息在其中
测试中,我们正在测试当 `LimitTracker` 被告知将 `value` 设置为超过最大值的 75% 时会发生什么。首先,我们创建一个新的 `MockMessenger`,他将以一个空的消息列表开始。然后我们创建一个新的 `LimitTracker` 并为其提供对新 `MockMessenger` 的引用和最大值 `100`。我们在 `LimitTracker` 上用一个大于 75% 的值 `80` 调用 `set_value` 方法。然后我们断言 `MockMessenger` 正在跟踪的消息列表现在应有一条消息
然而,该测试有一个问题,如下所示:
但是,此测试存在一个问题,如下所示:
```console
$ cargo test lennyp@vm-manjaro
$ cargo test
Compiling limit_tracker v0.1.0 (/home/lennyp/rust-lang/limit_tracker)
error[E0596]: cannot borrow `self.sent_messages` as mutable, as it is behind a `&` reference
--> src/lib.rs:58:13