Update Ch15

This commit is contained in:
Unisko PENG 2023-05-11 13:29:44 +08:00
parent 2495743a7a
commit 5d41b08015

View File

@ -852,47 +852,15 @@ Rust 没有像其他语言那样拥有对象Rust 也没有像其他一些语
> 注the interface, 借鉴了 Java 语言的叫法,参见 [使用接口来拯救!](https://java.xfoss.com/ji-cheng-he-duo-tai-ji-zhi/ch08_interfaces_and_abstract_classes#interface_rescue)。
这里所需的模拟对象,在调用 `send` 时,不是发送电子邮件或手机短信,而是将只追踪其被告知要发送的消息。这里可以创建出该模拟对象的一个新实例,然后创建一个用到这个模拟对象的 `LimitTracker`,接着调用 `LimitTracker` 上的那个 `set_value` 方法,并随后检查该模拟对象是否有着咱们期望的消息。下面清单 15-21 给出了实现一个模拟对象,来刚好完成这些步骤的一种尝试,但借用检查器不会放行这个尝试
我们需要一个模拟对象,他不会在我们调用 `send` 时发送电子邮件或文本消息,而只会记录他被告知要发送的消息。我们可以创建模拟对象的一个新实例,创建一个使用该模拟对象的 `LimitTracker` 实例,调用 `LimitTracker` 实例的 `set_value` 方法,然后检查该模拟对象是否有我们期望的消息。清单 15-21 给出了一个实现模拟对象的尝试,来就这样做,但借用检查器不允许这样做
文件名:`src/lib.rs`
```rust
#[cfg(test)]
mod tests {
use super::*;
struct MockMessenger {
sent_messages: Vec<String>,
}
impl MockMessenger {
fn new() -> MockMessenger {
MockMessenger {
sent_messages: vec! [],
}
}
}
impl Messenger for MockMessenger {
fn send(&self, message: &str) {
self.sent_messages.push(String::from(message));
}
}
#[test]
fn it_sends_an_over_75_percent_waring_message() {
let mock_messenger = MockMessenger::new();
let mut limit_tracker = LimitTracker::new(&mock_messenger, 100);
limit_tracker.set_value(80);
assert_eq! (mock_messenger.sent_messages.len(), 1);
}
}
{{#include ../projects/limit_tracker/src/lib.rs:40:}}
```
*清单 15-21实现不被借用检查器允许的一个 `MockMessenger` 的尝试*
*清单 15-21试图实现一个借用检查器不允许的 `MockMessenger`*
此测试代码定义了有着一个 `sent_messages` 字段的 `MockMessenger` 结构体,该字段有着用于跟踪其被告知要发送消息的一些 `String` 值的 `Vec` 类型变量。这里还定义了一个关联函数 `new`,来令到创建出以空消息清单开头的那些新 `MockMessenger` 类型值,便利起来。随后这里就为 `MockMessenger` 实现了那个 `Messenger` 特质,于是就可以将某个 `MockMessenger` 给到一个 `LimitTracker` 了。在那个 `send` 方法的定义中,这里将所传入的消息,取作了参数,并将其存储在 `MockMessenger``sent_messages` 清单中。