mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-03-15 03:40:29 +08:00
Update Ch15
This commit is contained in:
parent
2495743a7a
commit
5d41b08015
@ -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` 清单中。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user