Update Ch10

This commit is contained in:
Unisko PENG 2023-04-17 09:14:53 +08:00
parent 70d27c832f
commit f1f6e6b31e

View File

@ -829,11 +829,11 @@ impl<T: Display + PartialOrd> Pair<T> {
}
```
*清单 10-15根据特质边界而有条件地实现泛型上的方法(conditionally implementing methods on a generic type depending on trait bounds*
*清单 10-15根据特质边界在泛型上有条件地实现方法,conditionally implementing methods on a generic type depending on trait bounds*
> **注意**:这里的 `new` 是个关联函数,而非方法!只能以 `Pair::new` 形式使用。要作为方法使用,函数就必须要有一个 `self` 参数。
还可以对任意实现了另一特质的类型,有条件地实现某个特质。在任意满足某些特质边界的类型上,某个特质的实现,被称作 *一揽子实现blanket implementations*,这样的做法在 Rust 标准库中有广泛使用。比如,标准库就在实现了 `Display` 特质的全部类型上,实现了 `ToString` 这个特质。标准库中这个 `impl` 代码快,看起来与下面的类似:
咱们还可对实现了另一特质的任意类型,有条件地实现某个特质。在满足这些特质边界的类型上的特质实现,被称作 *一揽子实现blanket implementations*,在 Rust 标准库中广泛使用了一揽子实现。比如,标准库就在实现了 `Display` 特质的全部类型上,实现了 `ToString` 特质。标准库中这个 `impl` 代码块,看起来与下面的类似:
```rust
impl<T: Display> ToString for T {
@ -841,18 +841,16 @@ impl<T: Display> ToString for T {
}
```
由于标准库有着这样的一揽子实现,那么就可以在实现了 `Display` 特质的全部类型上,调用由 `ToString` 特质所定义的 `to_string` 方法。比如,由于正是实现了 `Display` 特质,那么这里就可以像下面这样,把整数转换为他们对应的 `String`
由于标准库有着这个一揽子实现,咱们便可在实现了 `Display` 特质的全部类型上,调用由 `ToString` 特质所定义的 `to_string` 方法。比如,由于整数类型实现了 `Display` 特质,那么咱们就可以像下面这样,把整数转换为他们对应的 `String`
```rust
let s = 3.to_string();
```
一揽子实现,会出现在特质文档的 “相关实现器Implementors” 部分。
一揽子实现,会出现在特质文档的 “相关实现器Implementors” 部分。
### 小结
特质与特质边界这两个特性允许咱们编写运用了泛型参数的代码从而在减少代码重复的同时还向编译器指出希望该泛型有着特定行为。随后编译器就会使用特质边界信息来就代码所用到的全部具体类型是否提供到正确行为进行检查。在一般的动态类型语言dynamically typed languages若调用某个类型上尚未定义的方法那么就会在运行时收到错误。但 Rust 将这些错误,移到了编译时,这样就要在代码还不能运行的时候,就被强制要求修复这些问题。此外,由于已在编译时检查过这些问题,那么就不必编写对运行时行为进行检查的代码了。在不必放弃泛型灵活性之下,就提升了程序性能。
特质与特质边界这两个特性允许咱们编写出运用泛型参数来减少代码重复的代码并还向编译器指出了咱们希望该泛型有着特定行为。随后编译器就能使用特质边界信息来检查代码用到的全部具体类型是否提供到正确行为。在一般的动态类型语言dynamically typed languages若调用某个类型上尚未定义的方法咱们将在运行时收到报错。但 Rust 将这些错误移到了编译时,这样在代码还不能运行的时候,咱们就被强制要求修复这些问题。此外,由于已在编译时被检查过,因此咱们就不必编写检查运行时行为的代码。这样做在提升了性能的同时,而不必放弃泛型灵活性。
## 使用生命周期对引用加以验证