Merge pull request #578 from jinliming2/update-ch05-03

update ch05-03
This commit is contained in:
KaiserY 2022-01-13 10:55:05 +08:00 committed by GitHub
commit 85fa0853a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2,7 +2,7 @@
> [ch05-03-method-syntax.md](https://github.com/rust-lang/book/blob/main/src/ch05-03-method-syntax.md)
> <br>
> commit b4132ae4991b16076ca2293b0c2c3283a7a1b951
> commit 8a0bb3c96e71927b80fa2286d7a5a5f2547c6aa4
**方法** 与函数类似:它们使用 `fn` 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或 trait 对象的上下文,将分别在第六章和第十七章讲解),并且它们第一个参数总是 `self`,它代表调用该方法的结构体实例。
@ -68,7 +68,7 @@ fn main() {
}
```
在这里,我们选择让 `width` 方法的行为是如果实例的 `width` 字段的值大于 0返回 `true`。如果该值为 0则返回 `false`:我们可以在同名的方法中使用一个字段。我们可以在同名的方法中使用一个字段来达到任何目的。在 `main` 中,当我们在 `rect1.width` 后面加上括号时。Rust 知道我们指的是方法 `width`。当我们不使用圆括号时Rust 知道我们指的是字段 `width`
在这里,我们选择让 `width` 方法在实例的 `width` 字段的值大于 0 时返回 `true`,等于 0 时则返回 `false`:我们可以出于任何目的,在同名的方法中使用同名的字段。在 `main` 中,当我们在 `rect1.width` 后面加上括号时。Rust 知道我们指的是方法 `width`。当我们不使用圆括号时Rust 知道我们指的是字段 `width`
通常,但并不总是如此,与字段同名的方法将被定义为只返回字段中的值,而不做其他事情。这样的方法被称为 *getters*Rust 并不像其他一些语言那样为结构字段自动实现它们。Getters 很有用,因为你可以把字段变成私有的,但方法是公共的,这样就可以把对字段的只读访问作为该类型公共 API 的一部分。我们将在第七章中讨论什么是公有和私有,以及如何将一个字段或方法指定为公有或私有。
@ -106,7 +106,7 @@ fn main() {
### 带有更多参数的方法
让我们通过实现 `Rectangle` 结构体上的另一方法来练习使用方法。这回,我们让一个 `Rectangle` 的实例获取另一个 `Rectangle` 实例,如果 `self` 能完全包含第二个长方形则返回 `true`;否则返回 `false`。一旦定义了 `can_hold` 方法,就可以编写示例 5-14 中的代码。
让我们通过实现 `Rectangle` 结构体上的另一方法来练习使用方法。这回,我们让一个 `Rectangle` 的实例获取另一个 `Rectangle` 实例,如果 `self` (第一个 `Rectangle`能完全包含第二个长方形则返回 `true`;否则返回 `false`。一旦我们定义了 `can_hold` 方法,就可以编写示例 5-14 中的代码。
<span class="filename">文件名: src/main.rs</span>
@ -158,7 +158,7 @@ impl Rectangle {
### 关联函数
所有在 `impl` 块中定义的函数被称为 **关联函数***associated functions*),因为它们与 `impl` 后面命名的类型相关。我们可以定义不以 `self` 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数`String::from` 函数,它是在 `String` 类型上定义的
所有在 `impl` 块中定义的函数被称为 **关联函数***associated functions*),因为它们与 `impl` 后面命名的类型相关。我们可以定义不以 `self` 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数:在 `String` 类型上定义的 `String::from` 函数
不是方法的关联函数经常被用作返回一个结构体新实例的构造函数,例如我们可以提供一个关联函数,它接受一个维度参数并且同时作为宽和高,这样可以更轻松的创建一个正方形 `Rectangle` 而不必指定两次同样的值: