Update Ch10

This commit is contained in:
Peng Hailin, 2023-04-12 20:45:03 +08:00
parent fa9a76f031
commit d90c973767

View File

@ -345,14 +345,14 @@ enum Result <T, E> {
}
```
这个 `Result` 对两种类型通用,`T` 与 `E`,并有着两个变种:保存了一个类型 `T` 值的 `Ok`,与保存了一个类型 `E` 值的 `Err`。这个定义使得在某个操作可能成功(便返回某种类型 `T` 的一个值),或失败(便返回一个某种类型 `E` 的值)的地方,使用这个 `Result` 枚举方便起来。事实上,这就是在清单 9-3 中打开某个文件时所用到的,在文件被成功打开时,其中的 `T` 就用 `std::fs::File` 填充上了,而在打开那个文件时存在某些问题时,那么其中的 `E` 就以 `std::io::Error` 填充。
`Result` 枚举对 `T``E` 两种类型通用,并有着两个变种:保存了一个类型 `T` 值的 `Ok`,与保存了一个类型 `E` 值的 `Err`。这个定义使得在某个操作可能成功(便返回某种类型 `T` 的一个值),或失败(便返回一个某种类型 `E` 的值)的地方,使用 `Result` 枚举方便起来。事实上,这正是咱们在清单 9-3 中,打开某个文件时所用到的,在文件被成功打开时,其中的 `T` 就以 `std::fs::File` 给填上了,而当打开那个文件时,若存在某些问题,那么其中的 `E` 就会被 `std::io::Error` 填充。
在意识到代码中有着多个仅在其所保存值类型上,有区别的结构体或枚举,这样的一些情况时,就可以通过使用泛型,而避免代码重复。
当咱们认识到咱们的代码中,有着仅在其所保存值类型上有区别的多个结构体或枚举的情况时,咱们就可以通过使用泛型避免代码重复。
### 在方法定义中
在结构体与枚举上,可以实现一些方法(正如在第 5 章中所做的那样),并也可以在这些方法的定义中使用泛型。下面清单 10-9 展示了在清单 10-6 中定义的那个 `Point<T>` 结构体,其上实现了个名为 `x` 的方法
咱们可以在结构体与枚举上实现方法(正如在第 5 章中咱们所做的),并也可以在他们定义中使用泛型。下面清单 10-9 展示了于其上实现了名为 `x` 方法的,咱们曾在清单 10-6 中定义的 `Point<T>` 结构体。
文件名:`src/main.rs`
@ -380,11 +380,12 @@ fn main() {
}
```
*清单 10-9`Point<T, U>` 结构体上实现一个将返回到类型 `T``x` 字段引用的名为 `x` 的方法*
*清单 10-9`Point<T, U>` 结构体上实现将返回到类型 `T``x` 字段引用的一个名为 `x` 的方法*
这里已在 `Point<T, U>` 上定义了一个名为 `x` 的、返回到字段 `x` 中数据一个引用的方法。通过在 `impl` 后将 `T` 声明为泛型Rust 就可以识别到 `Point` 中的尖括号(`<>` 里的类型为一个泛型,而非具体类型。对于这个泛型参数,这里是可以选择一个不同于前面结构体定义中的泛型参数的,但使用同样的名字在这里是惯例性的。在某个声明了泛型的 `impl` 里头编写的那些方法,不论泛型最终将以何种具体类型所代替,这些方法都将被定义在该类型的任意实例上。
这里已在 `Point<T, U>` 上,定义了名为 `x` 的、返回到字段 `x` 中数据引用的一个方法。经由在 `impl` 后,将 `T` 声明为泛型Rust 就可以识别出,`Point` 中尖括号(`<>` 里的类型是个泛型而非具体类型。对于这个泛型参数,咱们可以选择不同于前面结构体定义中,所声明的泛型参数名字,但使用同一个名字是依照惯例的。在声明了泛型的 `impl` 里编写的方法,不论泛型最终将以何种具体类型所代替,这些方法都将定义在该类型的所有实例上。
当咱们在类型上定义方法时,咱们还可以在泛型上指定约束条件。比如,只在 `Point<f32>` 的实例,而非任意泛型的 `Point<T>` 实例上实现方法。在下面清单 10-10 中,咱们使用了具体类型 `f32`,意味着在 `impl` 之后咱们没有声明任何类型。
在将一些方法定义在类型上时,还可以在这些泛型上指明一些约束条件。比如这里就可以只在 `Point<f32>`,而不是有着任意泛型的 `Point<T>` 实例上实现方法。在下面清单 10-10 中,就使用了具体类型 `f32`,即指在 `impl` 之后没有声明任何类型。
文件名:`src/main.rs`