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