From d90c973767b6e33904367f78df3b8ea08d1ae47f Mon Sep 17 00:00:00 2001 From: "Peng Hailin," Date: Wed, 12 Apr 2023 20:45:03 +0800 Subject: [PATCH] Update Ch10 --- src/Ch10_Generic_Types_Traits_and_Lifetimes.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md index e5eeaba..a9d99a1 100644 --- a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md +++ b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md @@ -345,14 +345,14 @@ enum Result { } ``` -这个 `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` 结构体,其上实现了个名为 `x` 的方法。 +咱们可以在结构体与枚举上实现方法(正如在第 5 章中咱们所做的),并也可以在他们定义中使用泛型。下面清单 10-9 展示了于其上实现了名为 `x` 方法的,咱们曾在清单 10-6 中定义的 `Point` 结构体。 文件名:`src/main.rs` @@ -380,11 +380,12 @@ fn main() { } ``` -*清单 10-9:在 `Point` 结构体上实现一个将返回到类型 `T` 的 `x` 字段引用的名为 `x` 的方法* +*清单 10-9:在 `Point` 结构体上,实现将返回到类型 `T` 的 `x` 字段的引用的一个名为 `x` 的方法* -这里已在 `Point` 上定义了一个名为 `x` 的、返回到字段 `x` 中数据一个引用的方法。通过在 `impl` 后将 `T` 声明为泛型,Rust 就可以识别到 `Point` 中的尖括号(`<>`) 里的类型为一个泛型,而非具体类型。对于这个泛型参数,这里是可以选择一个不同于前面结构体定义中的泛型参数的,但使用同样的名字在这里是惯例性的。在某个声明了泛型的 `impl` 里头编写的那些方法,不论泛型最终将以何种具体类型所代替,这些方法都将被定义在该类型的任意实例上。 +这里已在 `Point` 上,定义了名为 `x` 的、返回到字段 `x` 中数据引用的一个方法。经由在 `impl` 后,将 `T` 声明为泛型,Rust 就可以识别出,`Point` 中尖括号(`<>`) 里的类型是个泛型而非具体类型。对于这个泛型参数,咱们可以选择不同于前面结构体定义中,所声明的泛型参数名字,但使用同一个名字是依照惯例的。在声明了泛型的 `impl` 里编写的方法,不论泛型最终将以何种具体类型所代替,这些方法都将定义在该类型的所有实例上。 + +当咱们在类型上定义方法时,咱们还可以在泛型上指定约束条件。比如,只在 `Point` 的实例,而非任意泛型的 `Point` 实例上实现方法。在下面清单 10-10 中,咱们使用了具体类型 `f32`,意味着在 `impl` 之后咱们没有声明任何类型。 -在将一些方法定义在类型上时,还可以在这些泛型上指明一些约束条件。比如这里就可以只在 `Point`,而不是有着任意泛型的 `Point` 实例上实现方法。在下面清单 10-10 中,就使用了具体类型 `f32`,即指在 `impl` 之后没有声明任何类型。 文件名:`src/main.rs`