Refined Ch05.

This commit is contained in:
rust-lang.xfoss.com 2023-12-15 16:49:34 +08:00
parent 2012f87111
commit 9e7b57f06b
2 changed files with 26 additions and 11 deletions

View File

@ -13,6 +13,13 @@ impl Rectangle {
(self.width > other.width && self.height > other.height)
|| (self.width > other.height && self.height > other.width)
}
fn square(size: u32) -> Self {
Self {
width: size,
height: size,
}
}
}
fn main() {

View File

@ -184,16 +184,17 @@ impl Rectangle {
**associated functions**
由于定义在 `impl` 代码块内部的全部函数,都是与那个在 `impl` 关键字之后命名的类型相关联的,因此他们都叫做 *关联函数associated functions*。因为一些关联函数不需要用到该类型的实例,因此可把这些函数定义为不将 `self` 作为首个参数的关联函数(而这样的话,这些函数就不是方法了)。前面就已用到过这样的一个关联函数:`String::from` 函数就是定义在 `String` 类型上的。
`impl` 代码块中定义的所有函数,都被称为 *关联函数associated functions*,因为他们与 `impl` 后命名的那个类型相关联。我们可以定义不以 `self` 作为第一个参数的关联函数(而因此就不属于方法),因为他们不需要处理该类型的某个实例。我们已经使用过一个这样的函数:定义在 `String` 类型上的 `String::from` 函数。
非方法的关联函数,通常用于返回结构体新实例的构造函数。这些函数通常被称为 `new`,但 `new` 并不是个特殊的名字,也没有内置在语言中。例如,我们可以选择提供一个名为 `square` 的关联函数,该函数只有一个边长参数,并将其同时用作宽度和高度,这样就可以更轻松地创建一个正方形的 `Rectangle`,而不必两次指定同一个值两次:
非方法的关联函数,通常用于将会返回一个该结构体新实例的构造函数。比如,这里就可提供有着一维参数,并将该一维参数同时用作宽和高的这么一个关联函数,如此就令到相比于两次指定同样值,而更容易创建除正方形的 `Rectangle`
文件名:`src/main.rs`
```rust
impl Rectangle {
fn square(size: u32) -> Rectangle {
Rectangle {
fn square(size: u32) -> Self {
Self {
width: size,
height: size,
}
@ -201,7 +202,10 @@ impl Rectangle {
}
```
要调用这个关联函数,就要使用带有结构体名字的 `::` 语法;`let sq = Rectangle::square(3);` 就是一个示例;该函数是是在那个结构体的命名空间之下的:`::` 语法,同时用于关联函数,与由模组创建出的命名空间。在第 7 章会讨论到 Rust 的模组概念。
返回类型和函数体中的两个 `Self` 关键字,是出现于 `impl` 关键字后那个类型的别名,在本例中即 `Rectangle`
要调用这个关联函数,我们要使用带有结构体名字的 `::` 语法;`let sq = Rectangle::square(3);` 就是个例子。该函数的命名空间为该结构体:`::` 这种语法,既用于关联函数,也用于由模块创建出的命名空间。我们将在 [第 7 章](../packages_crates_and_modules/defining_modules.md) 讨论模块。
## 多个 `impl` 代码块
@ -209,7 +213,8 @@ impl Rectangle {
**Multiple `impl` Blocks**
所有结构体都允许有多个 `impl` 代码块。比如前面的清单 5-15 就与下面清单 5-16 给出的代码等价,其中各个方法都在各自的 `impl` 代码块中:
每个结构体,都可以有多个 `impl` 块。例如,清单 5-15 就相当于下面清单 5-16 中的代码,其中每个方法都有自己的 `impl` 块。
```rust
impl Rectangle {
@ -226,12 +231,15 @@ impl Rectangle {
}
```
*清单 5-16使用多个 `impl` 代码块对清单 5-15 进行重写*
*清单 5-16使用多个 `impl` 代码块重写清单 5-15*
虽然这里并无将这些方法分开到多个 `impl` 代码块中的理由,不过这样做也是有效的语法。在第 10 章讨论到泛型和特质时,就会看到多个 `impl` 代码块是有用的情形。
# 本章小节
这里没有理由,将这些方法分隔成多个 `impl` 块,但这是有效的语法。在第 10 章讨论泛型和特质时,我们将看到多个 `impl` 代码块的用处。
结构体实现了创建对于特定领域有意义的定制类型。通过运用结构体,就可以将有关联的数据片段相互连接起来,并给各个数据取名字来让代码清晰。在 `impl` 代码块中,可定义与类型关联的函数,而方法则是一类实现了指定结构体实例所拥有行为的关联函数。
然而结构体并非能够创建定制类型的唯一方式:加下了就要转向到 Rust 的枚举特性,将另一工具加入到编程工具箱。
# 本章小结
结构体可让咱们创建出,对咱们领域有意义的自定义类型。通过使用结构体,咱们可以将相关的数据片段,相互连接起来,并为每个片段命名,使咱们的代码清晰明了。在 `impl` 代码块中,咱们可以定义出,与咱们类型相关联的函数,而方法就是一种,可以让咱们指定出,结构体实例所具有行为的关联函数。
但是,结构体并不是咱们可以创建自定义类型的唯一方法:咱们来使用 Rust 的枚举特性,为咱们的工具箱添加另一种工具。