mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-03-14 03:10:44 +08:00
Update Ch10
This commit is contained in:
parent
70d27c832f
commit
f1f6e6b31e
@ -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 将这些错误移到了编译时,这样在代码还不能运行的时候,咱们就被强制要求修复这些问题。此外,由于已在编译时被检查过,因此咱们就不必编写检查运行时行为的代码。这样做在提升了性能的同时,而不必放弃泛型灵活性。
|
||||
|
||||
|
||||
## 使用生命周期对引用加以验证
|
||||
|
Loading…
Reference in New Issue
Block a user