Update ch05-03-method-syntax.md

This commit is contained in:
dinosaur 2024-03-03 13:56:40 +08:00 committed by GitHub
parent d6847b95b1
commit 4a4b68421c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -20,7 +20,7 @@
为了使函数定义于 `Rectangle` 的上下文中,我们开始了一个 `impl` 块(`impl` 是 *implementation* 的缩写),这个 `impl` 块中的所有内容都将与 `Rectangle` 类型相关联。接着将 `area` 函数移动到 `impl` 大括号中,并将签名中的第一个(在这里也是唯一一个)参数和函数体中其他地方的对应参数改成 `self`。然后在 `main` 中将我们先前调用 `area` 方法并传递 `rect1` 作为参数的地方,改成使用 **方法语法***method syntax*)在 `Rectangle` 实例上调用 `area` 方法。方法语法获取一个实例并加上一个点号,后跟方法名、圆括号以及任何参数。
`area` 的签名中,使用 `&self` 来替代 `rectangle: &Rectangle``&self` 实际上是 `self: &Self` 的缩写。在一个 `impl` 块中,`Self` 类型是 `impl` 块的类型的别名。方法的第一个参数必须有一个名为 `self` 的`Self` 类型的参数,所以 Rust 让你在第一个参数位置上只用 `self` 这个名字来缩写。注意,我们仍然需要在 `self` 前面使用 `&` 来表示这个方法借用了 `Self` 实例,就像我们在 `rectangle: &Rectangle` 中做的那样。方法可以选择获得 `self` 的所有权,或者像我们这里一样不可变地借用 `self`,或者可变地借用 `self`,就跟其他参数一样。
`area` 的签名中,使用 `&self` 来替代 `rectangle: &Rectangle``&self` 实际上是 `self: &Self` 的缩写。在一个 `impl` 块中,`Self` 类型是 `impl` 块的类型的别名。方法的第一个参数必须有一个名为 `self` 的`Self` 类型的参数,所以 Rust 让你在第一个参数位置上只用 `self` 这个名字来简化。注意,我们仍然需要在 `self` 前面使用 `&` 来表示这个方法借用了 `Self` 实例,就像我们在 `rectangle: &Rectangle` 中做的那样。方法可以选择获得 `self` 的所有权,或者像我们这里一样不可变地借用 `self`,或者可变地借用 `self`,就跟其他参数一样。
这里选择 `&self` 的理由跟在函数版本中使用 `&Rectangle` 是相同的:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要在方法中改变调用方法的实例,需要将第一个参数改为 `&mut self`。通过仅仅使用 `self` 作为第一个参数来使方法获取实例的所有权是很少见的;这种技术通常用在当方法将 `self` 转换成别的实例的时候,这时我们想要防止调用者在转换之后使用原始的实例。