|
|
@ -6,7 +6,7 @@
|
|
|
|
object.method()
|
|
|
|
object.method()
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
例如读取一个文件写入缓冲区,如果用函数的写法 `read(f,buffer)`,用方法的写法 `f.read(buffer)`。不过与其它语言 `class` 跟方法的联动使用不同(这里可能要修改下),Rust 的方法往往跟结构体、枚举、特征一起使用,特征(Trait)将在后面几章进行介绍。
|
|
|
|
例如读取一个文件写入缓冲区,如果用函数的写法 `read(f, buffer)`,用方法的写法 `f.read(buffer)`。不过与其它语言 `class` 跟方法的联动使用不同(这里可能要修改下),Rust 的方法往往跟结构体、枚举、特征(Trait)一起使用,特征将在后面几章进行介绍。
|
|
|
|
|
|
|
|
|
|
|
|
## 定义方法
|
|
|
|
## 定义方法
|
|
|
|
|
|
|
|
|
|
|
@ -73,6 +73,7 @@ fn main() {
|
|
|
|
`impl Rectangle {}` 表示为 `Rectangle` 实现方法(`impl` 是实现 _implementation_ 的缩写),这样的写法表明 `impl` 语句块中的一切都是跟 `Rectangle` 相关联的。
|
|
|
|
`impl Rectangle {}` 表示为 `Rectangle` 实现方法(`impl` 是实现 _implementation_ 的缩写),这样的写法表明 `impl` 语句块中的一切都是跟 `Rectangle` 相关联的。
|
|
|
|
|
|
|
|
|
|
|
|
#### self、&self 和 &mut self
|
|
|
|
#### self、&self 和 &mut self
|
|
|
|
|
|
|
|
|
|
|
|
接下里的内容非常重要,请大家仔细看。在 `area` 的签名中,我们使用 `&self` 替代 `rectangle: &Rectangle`,`&self` 其实是 `self: &Self` 的简写(注意大小写)。在一个 `impl` 块内,`Self` 指代被实现方法的结构体类型,`self` 指代此类型的实例,换句话说,`self` 指代的是 `Rectangle` 结构体实例,这样的写法会让我们的代码简洁很多,而且非常便于理解:我们为哪个结构体实现方法,那么 `self` 就是指代哪个结构体的实例。
|
|
|
|
接下里的内容非常重要,请大家仔细看。在 `area` 的签名中,我们使用 `&self` 替代 `rectangle: &Rectangle`,`&self` 其实是 `self: &Self` 的简写(注意大小写)。在一个 `impl` 块内,`Self` 指代被实现方法的结构体类型,`self` 指代此类型的实例,换句话说,`self` 指代的是 `Rectangle` 结构体实例,这样的写法会让我们的代码简洁很多,而且非常便于理解:我们为哪个结构体实现方法,那么 `self` 就是指代哪个结构体的实例。
|
|
|
|
|
|
|
|
|
|
|
|
需要注意的是,`self` 依然有所有权的概念:
|
|
|
|
需要注意的是,`self` 依然有所有权的概念:
|
|
|
@ -113,7 +114,7 @@ fn main() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
当我们使用 `rect1.width()` 时, Rust 知道我们调用的是它的方法,如果使用 `rect1.width`,则是访问它的字段。
|
|
|
|
当我们使用 `rect1.width()` 时,Rust 知道我们调用的是它的方法,如果使用 `rect1.width`,则是访问它的字段。
|
|
|
|
|
|
|
|
|
|
|
|
一般来说,方法跟字段同名,往往适用于实现 `getter` 访问器,例如:
|
|
|
|
一般来说,方法跟字段同名,往往适用于实现 `getter` 访问器,例如:
|
|
|
|
|
|
|
|
|
|
|
@ -221,7 +222,7 @@ impl Rectangle {
|
|
|
|
|
|
|
|
|
|
|
|
> Rust 中有一个约定俗称的规则,使用 `new` 来作为构造器的名称,出于设计上的考虑,Rust 特地没有用 `new` 作为关键字
|
|
|
|
> Rust 中有一个约定俗称的规则,使用 `new` 来作为构造器的名称,出于设计上的考虑,Rust 特地没有用 `new` 作为关键字
|
|
|
|
|
|
|
|
|
|
|
|
因为是函数,所以不能用 `.` 的方式来调用,我们需要用`::`来调用,例如 `let sq = Rectangle::new(3,3);`。这个方法位于结构体的命名空间中:`::` 语法用于关联函数和模块创建的命名空间。
|
|
|
|
因为是函数,所以不能用 `.` 的方式来调用,我们需要用 `::` 来调用,例如 `let sq = Rectangle::new(3, 3);`。这个方法位于结构体的命名空间中:`::` 语法用于关联函数和模块创建的命名空间。
|
|
|
|
|
|
|
|
|
|
|
|
## 多个 impl 定义
|
|
|
|
## 多个 impl 定义
|
|
|
|
|
|
|
|
|
|
|
@ -276,7 +277,6 @@ m.call();
|
|
|
|
|
|
|
|
|
|
|
|
除了结构体和枚举,我们还能为特征(trait)实现方法,这将在下一章进行讲解,在此之前,先来看看泛型。
|
|
|
|
除了结构体和枚举,我们还能为特征(trait)实现方法,这将在下一章进行讲解,在此之前,先来看看泛型。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 课后练习
|
|
|
|
## 课后练习
|
|
|
|
|
|
|
|
|
|
|
|
> [Rust By Practice](https://zh.practice.rs/method.html),支持代码在线编辑和运行,并提供详细的[习题解答](https://github.com/sunface/rust-by-practice)。
|
|
|
|
> [Rust By Practice](https://zh.practice.rs/method.html),支持代码在线编辑和运行,并提供详细的[习题解答](https://github.com/sunface/rust-by-practice)。
|
|
|
|