mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-01-30 06:00:13 +08:00
Update Ch10
This commit is contained in:
parent
7c7b31ee58
commit
f12112f1ff
@ -550,12 +550,12 @@ impl Summary for Tweet {
|
||||
}
|
||||
```
|
||||
|
||||
*清单 10-13:在 `NewsArticle` 与 `Tweet` 上对 `Summary` 进行实现*
|
||||
*清单 10-13:在 `NewsArticle` 与 `Tweet` 两个类型上实现 `Summary` 特质*
|
||||
|
||||
|
||||
在某个类型上实现一个特质,与实现常规方法类似。不同之处为,在 `impl` 关键字后面,要放置那个打算实现的特质名字,然后要使用 `for` 关键字,并随后指定那个打算为其实现特质的类型名字。在这个 `impl` 代码块内部,就要放入前面特质定义所定义出的那些方法签名。这里不再是在各个签名之后添加分号,而是使用花括号,并将这里打算要特定类型所具有该特质的方法,填充到该方法的方法体中。
|
||||
在类型上实现特质类似于实现常规方法。区别在于,在 `impl` 之后,咱们放置的是咱们打算实现特质的名字,之后要使用 `for` 关键字,后面要指定咱们打算为其实现特质的类型名字。在 `impl` 代码块内,咱们要放入特质定义所定义的方法签名。咱们不再于各个签名之后添加分号,而是要使用花括号,并将咱们想要这个特质对于特定类型而所具有的方法,填充到方法体中。
|
||||
|
||||
既然这个库已经在 `NewsArticle` 与 `Tweet` 上实现了那个 `Summary` 特质,那么该库代码箱的用户,就可以调用常规方法的同样方式,调用 `NewsArticle` 与 `Tweet` 实例上的这些特质方法了。唯一区别就是,用户必须将该特质,与相关类型,同时带入到作用域中。下面就是某个二进制代码箱,如何使用这里的 `aggregator` 库代码箱的示例:
|
||||
既然库已在 `NewsArticle` 与 `Tweet` 上实现了 `Summary` 特质,那么库代码箱的用户,就可以如同调用常规方法的那样,调用 `NewsArticle` 与 `Tweet` 实例上的这些特质方法了。唯一区别就是,用户必须将该特质,以及那些类型,同时带入到作用域中。下面就是某个二进制代码箱,怎样能用到咱们的 `aggregator` 库代码箱的示例:
|
||||
|
||||
|
||||
```rust
|
||||
@ -577,8 +577,7 @@ fn main() {
|
||||
|
||||
此代码会打印 `1 条推文:horse_ebooks: 当然,跟大家已经清楚的一样了,朋友们`。
|
||||
|
||||
依赖于 `aggregator` 代码箱的其他代码箱,同样可以将 `Summary` 特质带入其作用域,来将 `Summary` 实现在他们自己的类型上。
|
||||
要注意有个限制,就是只有在特质或类型属于本地代码箱时,才能将这个特质应用于这个类型上。比如,由于 `Tweet` 这个类型属于本地代码箱 `aggregator`,那么因此就可以将像是标准库的特质 `Display`,应用于像是定制类型 `Tweet` 上,而作为这个 `aggregator` 代码箱功能的一部分。由于那个 `Summary` 属于 `aggregator` 代码箱本地,因此在这里的 `aggregator` 代码箱中,还可将 `Summary` 应用在 `vec<T>` 上。
|
||||
依赖于 `aggregator` 代码箱的其他代码箱,同样可以将 `Summary` 特质带入其作用域,以在他们自己的类型上实现 `Summary`。有个限制条件要注意,即只有在特质或类型二者至少有一个属于代码箱本地的时,咱们才能在类型上实现特质。比如,由于 `Tweet` 这个类型属于本地代码箱 `aggregator`,那么因此就可以将像是标准库的特质 `Display`,应用于像是定制类型 `Tweet` 上,而作为这个 `aggregator` 代码箱功能的一部分。由于那个 `Summary` 属于 `aggregator` 代码箱本地,因此在这里的 `aggregator` 代码箱中,还可将 `Summary` 应用在 `vec<T>` 上。
|
||||
|
||||
|
||||
但这里是无法将外部特质,应用在外部类型上的。比如,由于 `Display` 特质与 `vec<T>` 类型都是定义在标准库中,而均不属于 `aggregator` 代码箱本地,那么在这里的 `aggregator` 代码箱里头,就不能够将 `Display` 特质,应用在 `vec<T>` 上。这种限制属于一种名为 *内聚性(coherrnce)* 属性的一部分,更具体地讲,就是 *孤儿规则(the orphan rule)*,之所以这样称呼,是由于未父类型缺席了(this restriction is part of a property called *coherence*, and more specifically the *orphan rule*, so named because the parent type is not present)。此规则确保其他人的代码无法破坏自己的代码,反之亦然。在没有这条规则下,两个代码箱就会将同一特质,对同一类型加以实现,那么 Rust 就不清楚要使用那个实现了。
|
||||
|
Loading…
Reference in New Issue
Block a user