mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-03-14 03:10:44 +08:00
Update Ch10
This commit is contained in:
parent
fa9a76f031
commit
d90c973767
@ -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`
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user