mirror of
https://github.com/rust-lang-cn/book-cn.git
synced 2025-02-02 15:28:40 +08:00
doc: Optimize the description at ch10-01
This commit is contained in:
parent
ce9f2e0342
commit
384b6c636b
@ -1,6 +1,6 @@
|
||||
## 泛型数据类型
|
||||
|
||||
我们可以使用泛型为像函数签名或结构体这样的项创建定义,这样它们就可以用于多种不同的具体数据类型。让我们看看如何使用泛型定义函数、结构体、枚举和方法,然后我们将讨论泛型如何影响代码性能。
|
||||
我们可以使用泛型为函数签名或结构体等项创建定义,这样它们就可以用于多种不同的具体数据类型。让我们看看如何使用泛型定义函数、结构体、枚举和方法,然后我们将讨论泛型如何影响代码性能。
|
||||
|
||||
### 在函数定义中使用泛型
|
||||
|
||||
@ -52,7 +52,7 @@ fn main() {
|
||||
|
||||
<span class="caption">示例 10-4:两个函数,不同点只是名称和签名类型</span>
|
||||
|
||||
`largest_i32` 函数是从示例 10-3 中摘出来的,它用来寻找 slice 中最大的 `i32`。`largest_char` 函数寻找 slice 中最大的 `char`。因为两者函数体的代码是一样的,我们可以定义一个函数,再引进泛型参数来消除这种重复。
|
||||
`largest_i32` 函数是从示例 10-3 中摘出来的,它用来寻找 slice 中最大的 `i32`。`largest_char` 函数寻找 slice 中最大的 `char`。因为两者函数体的代码一致,我们可以定义一个函数,再引进泛型参数来消除这种重复。
|
||||
|
||||
为了参数化新函数中的这些类型,我们也需要为类型参数取个名字,道理和给函数的形参起名一样。任何标识符都可以作为类型参数的名字。这里选用 `T`,因为传统上来说,Rust 的参数名字都比较短,通常就只有一个字母,同时,Rust 类型名的命名规范是骆驼命名法(CamelCase)。`T` 作为 “type” 的缩写是大部分 Rust 开发者的首选。
|
||||
|
||||
@ -184,7 +184,7 @@ fn main() {
|
||||
|
||||
<span class="caption">示例 10-8:使用两个泛型的 `Point`,这样 `x` 和 `y` 可能是不同类型</span>
|
||||
|
||||
现在所有这些 `Point` 实例都合法了!你可以在定义中使用任意多的泛型类型参数,不过太多的话,代码将难以阅读和理解。当你的代码中需要许多泛型类型时,它可能表明你的代码需要重构,分解成更小的结构。
|
||||
现在所有的 `Point` 实例都合法了!你可以在定义中使用任意多的泛型类型参数,不过太多的话,代码将难以阅读和理解。当你的代码中需要许多泛型类型时,它可能表明你的代码需要重构,分解成更小的结构。
|
||||
|
||||
### 枚举定义中的泛型
|
||||
|
||||
@ -197,7 +197,7 @@ enum Option<T> {
|
||||
}
|
||||
```
|
||||
|
||||
现在这个定义应该更容易理解了。如你所见 `Option<T>` 是一个拥有泛型 `T` 的枚举,它有两个成员:`Some`,它存放了一个类型 `T` 的值,和不存在任何值的`None`。通过 `Option<T>` 枚举可以表达有一个可能的值的抽象概念,同时因为 `Option<T>` 是泛型的,无论这个可能的值是什么类型都可以使用这个抽象。
|
||||
现在这个定义应该更容易理解了。如你所见 `Option<T>` 是一个拥有泛型 `T` 的枚举,它有两个成员:`Some`,它存放了一个类型 `T` 的值,和不存在任何值的 `None`。通过 `Option<T>` 枚举可以表达有一个可能的值的抽象概念,同时因为 `Option<T>` 是泛型的,无论这个可能的值是什么类型都可以使用这个抽象。
|
||||
|
||||
枚举也可以拥有多个泛型类型。第九章使用过的 `Result` 枚举定义就是一个这样的例子:
|
||||
|
||||
@ -293,7 +293,7 @@ fn main() {
|
||||
|
||||
<span class="caption">示例 10-11:方法使用了与结构体定义中不同类型的泛型</span>
|
||||
|
||||
在 `main` 函数中,定义了一个有 `i32` 类型的 `x`(其值为 `5`)和 `f64` 的 `y`(其值为 `10.4`)的 `Point`。`p2` 则是一个有着字符串 slice 类型的 `x`(其值为 `"Hello"`)和 `char` 类型的 `y`(其值为`c`)的 `Point`。在 `p1` 上以 `p2` 作为参数调用 `mixup` 会返回一个 `p3`,它会有一个 `i32` 类型的 `x`,因为 `x` 来自 `p1`,并拥有一个 `char` 类型的 `y`,因为 `y` 来自 `p2`。`println!` 会打印出 `p3.x = 5, p3.y = c`。
|
||||
在 `main` 函数中,定义了一个有 `i32` 类型的 `x`(其值为 `5`)和 `f64` 的 `y`(其值为 `10.4`)的 `Point`。`p2` 则是一个有着字符串 slice 类型的 `x`(其值为 `"Hello"`)和 `char` 类型的 `y`(其值为 `c`)的 `Point`。在 `p1` 上以 `p2` 作为参数调用 `mixup` 会返回一个 `p3`,它会有一个 `i32` 类型的 `x`,因为 `x` 来自 `p1`,并拥有一个 `char` 类型的 `y`,因为 `y` 来自 `p2`。`println!` 会打印出 `p3.x = 5, p3.y = c`。
|
||||
|
||||
这个例子的目的是展示一些泛型通过 `impl` 声明而另一些通过方法定义声明的情况。这里泛型参数 `T` 和 `U` 声明于 `impl` 之后,因为他们与结构体定义相对应。而泛型参数 `V` 和 `W` 声明于 `fn mixup` 之后,因为他们只是相对于方法本身的。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user