|
|
@ -59,9 +59,9 @@ names and the types in their signatures</span>
|
|
|
|
|
|
|
|
|
|
|
|
这里`largest_i32`和`largest_char`有着完全相同的函数体,所以能够将这两个函数变成一个来减少重复就太好了。所幸通过引入一个泛型参数就能实现!
|
|
|
|
这里`largest_i32`和`largest_char`有着完全相同的函数体,所以能够将这两个函数变成一个来减少重复就太好了。所幸通过引入一个泛型参数就能实现!
|
|
|
|
|
|
|
|
|
|
|
|
为了参数化要定义的函数的签名中的类型,我们需要像给函数的值参数起名那样为这类型参数起一个名字。这里选择了名称`T`。任何标识符抖可以作为类型参数名,选择`T`是因为 Rust 的类型命名规范是骆驼命名法(CamelCase)。另外泛型类型参数的规范也倾向于简短,经常仅仅是一个字母。`T`作为“type”的缩写是大部分 Rust 程序员的首选。
|
|
|
|
为了参数化要定义的函数的签名中的类型,我们需要像给函数的值参数起名那样为这类型参数起一个名字。这里选择了名称`T`。任何标识符都可以作为类型参数名,选择`T`是因为 Rust 的类型命名规范是骆驼命名法(CamelCase)。另外泛型类型参数的规范也倾向于简短,经常仅仅是一个字母。`T`作为“type”的缩写是大部分 Rust 程序员的首选。
|
|
|
|
|
|
|
|
|
|
|
|
当需要再函数体中使用一个参数时,必须再函数签名中声明这个参数以便编译器能知道函数体中这个名称的意义。同理,当在函数签名中使用一个类型参数时,必须在使用它之前就声明它。类型参数声明位于函数名称与参数列表中间的尖括号中。
|
|
|
|
当需要再函数体中使用一个参数时,必须在函数签名中声明这个参数以便编译器能知道函数体中这个名称的意义。同理,当在函数签名中使用一个类型参数时,必须在使用它之前就声明它。类型参数声明位于函数名称与参数列表中间的尖括号中。
|
|
|
|
|
|
|
|
|
|
|
|
我们将要定义的泛型版本的`largest`函数的签名看起来像这样:
|
|
|
|
我们将要定义的泛型版本的`largest`函数的签名看起来像这样:
|
|
|
|
|
|
|
|
|
|
|
@ -149,7 +149,7 @@ values of type `T`</span>
|
|
|
|
|
|
|
|
|
|
|
|
其语法类似于函数定义中的泛型应用。首先,必须在结构体名称后面的尖括号中声明泛型参数的名称。接着在结构体定义中可以指定具体数据类型的位置使用泛型类型。
|
|
|
|
其语法类似于函数定义中的泛型应用。首先,必须在结构体名称后面的尖括号中声明泛型参数的名称。接着在结构体定义中可以指定具体数据类型的位置使用泛型类型。
|
|
|
|
|
|
|
|
|
|
|
|
注意`Point`的定义中是使用了要给泛型类型,我们想要表达的是结构体`Point`对于一些类型`T`是泛型的,而且无论这个泛型是什么,字段`x`和`y`**都是**相同类型的。如果尝试创建一个有不同类型值的`Point`的实例,像列表 10-7 中的代码就不能编译:
|
|
|
|
注意`Point`的定义中是使用了要给泛型类型,我们想要表达的是结构体`Point`对于一些类型`T`是泛型的,而且字段`x`和`y`**都是**相同类型的,无论它具体是何类型。如果尝试创建一个有不同类型值的`Point`的实例,像列表 10-7 中的代码就不能编译:
|
|
|
|
|
|
|
|
|
|
|
|
<span class="filename">Filename: src/main.rs</span>
|
|
|
|
<span class="filename">Filename: src/main.rs</span>
|
|
|
|
|
|
|
|
|
|
|
@ -216,7 +216,7 @@ enum Option<T> {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
换句话说`Option<T>`是一个拥有泛型`T`的枚举。它有两个成员:`Some`,它存放了一个类型`T`的值,和不存在任何值的`None`。标准库中只有这一个定义来支持创建任何具体类型的枚举值。“一个可能的值”是一个比具体类型的值更抽象的概念,而 Rust 允许我们不引入重复就能表现抽象的概念。
|
|
|
|
换句话说`Option<T>`是一个拥有泛型`T`的枚举。它有两个成员:`Some`,它存放了一个类型`T`的值,和不存在任何值的`None`。标准库中只有这一个定义来支持创建任何具体类型的枚举值。“一个可能的值”是一个比具体类型的值更抽象的概念,而 Rust 允许我们不引入重复代码就能表现抽象的概念。
|
|
|
|
|
|
|
|
|
|
|
|
枚举也可以拥有多个泛型类型。第九章使用过的`Result`枚举定义就是一个这样的例子:
|
|
|
|
枚举也可以拥有多个泛型类型。第九章使用过的`Result`枚举定义就是一个这样的例子:
|
|
|
|
|
|
|
|
|
|
|
@ -229,7 +229,7 @@ enum Result<T, E> {
|
|
|
|
|
|
|
|
|
|
|
|
`Result`枚举有两个泛型类型,`T`和`E`。`Result`有两个成员:`Ok`,它存放一个类型`T`的值,而`Err`则存放一个类型`E`的值。这个定义使得`Result`枚举能很方便的表达任何可能成功(返回`T`类型的值)也可能失败(返回`E`类型的值)的操作。回忆一下列表 9-2 中打开一个文件的场景,当文件被成功打开`T`被放入了`std::fs::File`类型而当打开文件出现问题时`E`被放入了`std::io::Error`类型。
|
|
|
|
`Result`枚举有两个泛型类型,`T`和`E`。`Result`有两个成员:`Ok`,它存放一个类型`T`的值,而`Err`则存放一个类型`E`的值。这个定义使得`Result`枚举能很方便的表达任何可能成功(返回`T`类型的值)也可能失败(返回`E`类型的值)的操作。回忆一下列表 9-2 中打开一个文件的场景,当文件被成功打开`T`被放入了`std::fs::File`类型而当打开文件出现问题时`E`被放入了`std::io::Error`类型。
|
|
|
|
|
|
|
|
|
|
|
|
当发现代码中有多个只有存放的值的类型有所不同的结构体或枚举定义时,你就应该像之前的函数定义中那样引入泛型类型来减少重复。
|
|
|
|
当发现代码中有多个只有存放的值的类型有所不同的结构体或枚举定义时,你就应该像之前的函数定义中那样引入泛型类型来减少重复代码。
|
|
|
|
|
|
|
|
|
|
|
|
### 方法定义中的枚举数据类型
|
|
|
|
### 方法定义中的枚举数据类型
|
|
|
|
|
|
|
|
|
|
|
|