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`