Update Ch15

This commit is contained in:
Unisko PENG 2023-05-11 11:28:01 +08:00
parent 6c571a491a
commit 2495743a7a

View File

@ -837,7 +837,7 @@ Rust 没有像其他语言那样拥有对象Rust 也没有像其他一些语
下面是我们要测试的情景:我们将创建一个库,跟踪某个数值与最大值的关系,并根据当前数值与最大值的接近程度发送消息。例如,这个库可以用来跟踪用户允许调用的 API 数量配额。
这个库将提供跟踪某个值接近最大值的程度,及在什么时刻发出什么消息的功能。使用这个库的应用,将被期望提供发送消息的机制:应用可以在应用中放置消息、发送电子邮件、发出手机短信或其他东西。这个库不需要知道这个细节。他所需的只是实现咱们将提供的名为 `Messenger` 特质的东西。以下清单 15-20 给出库的代码:
这个库将提供跟踪某个值接近最大值的程度,及在什么时刻发出什么消息的功能。使用这个库的应用,将被期望提供发送消息的机制:应用可以在应用中放置消息、发送电子邮件、发出手机短信或其他东西。库不需要知道这个细节。他所需的只是实现咱们将提供的名为 `Messenger` 特质的东西。以下清单 15-20 给出库的代码:
文件名:`src/lib.rs`
@ -848,7 +848,9 @@ Rust 没有像其他语言那样拥有对象Rust 也没有像其他一些语
*清单 15-20跟踪某个值与最大值接近程度并在值处于不同水平时发出告警的库*
此代码的一个重要部分,即是有着一个取了到 `self` 的不可变引用与消息文本、名为 `send` 方法的那个 `Messenger` 特质。这个特质就是咱们的模拟对象所需实现的接口the interface, 借鉴了 Java 语言的叫法,参见 [使用接口来拯救!](https://java.xfoss.com/ji-cheng-he-duo-tai-ji-zhi/ch08_interfaces_and_abstract_classes#interface_rescue)),从而这种模拟就可与真实对象的同样方式,而被使用。至于另一重要部分,则是这里打算测试 `LimitTracker` 上那个 `set_value` 方法的行为(注意:这里 `LimitTracker` 命名方式,同样借鉴了 Java 语言中类的命名约定)。这里可以改变所传入的那个 `value` 参数的值,但 `set_value` 不会返回任何咱们对其做出断言的东西。这里是要能够表达出,在咱们以实现了 `Messenger` 特质的某物,及 `max` 的某个特定值,而创建出一个 `LimitTracker` 下,当咱们传入不同数字的 `value` 时,那个信使方法,就被告知要发送一些恰当的消息。
这段代码的一个重要部分是 `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)。
这里所需的模拟对象,在调用 `send` 时,不是发送电子邮件或手机短信,而是将只追踪其被告知要发送的消息。这里可以创建出该模拟对象的一个新实例,然后创建一个用到这个模拟对象的 `LimitTracker`,接着调用 `LimitTracker` 上的那个 `set_value` 方法,并随后检查该模拟对象是否有着咱们期望的消息。下面清单 15-21 给出了实现一个模拟对象,来刚好完成这些步骤的一种尝试,但借用检查器不会放行这个尝试: