|
|
@ -44,7 +44,7 @@ struct</span>
|
|
|
|
|
|
|
|
|
|
|
|
在`area`的签名中,开始使用`&self`来替代`rectangle: &Rectangle`,因为该方法位于`impl Rectangle` 上下文中所以 Rust 知道`self`的类型是`Rectangle`。注意仍然需要在`self`前面加上`&`,就像`&Rectangle`一样。方法可以选择获取`self`的所有权,像我们这里一样不可变的借用`self`,或者可变的借用`self`,就跟其他别的参数一样。
|
|
|
|
在`area`的签名中,开始使用`&self`来替代`rectangle: &Rectangle`,因为该方法位于`impl Rectangle` 上下文中所以 Rust 知道`self`的类型是`Rectangle`。注意仍然需要在`self`前面加上`&`,就像`&Rectangle`一样。方法可以选择获取`self`的所有权,像我们这里一样不可变的借用`self`,或者可变的借用`self`,就跟其他别的参数一样。
|
|
|
|
|
|
|
|
|
|
|
|
这里选择`&self`跟在函数版本中使用`&Rectangle`出于同样的理由:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要能够在方法中改变调用方法的实例的话,需要将抵押给参数改为`&mut self`。通过仅仅使用`self`作为第一个参数来使方法获取实例的所有权,不过这是很少见的;这通常用在当方法将`self`转换成别的实例的时候,同时我们想要防止调用者在转换之后使用原始的实例。
|
|
|
|
这里选择`&self`跟在函数版本中使用`&Rectangle`出于同样的理由:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要能够在方法中改变调用方法的实例的话,需要将第一个参数改为`&mut self`。通过仅仅使用`self`作为第一个参数来使方法获取实例的所有权,不过这是很少见的;这通常用在当方法将`self`转换成别的实例的时候,同时我们想要防止调用者在转换之后使用原始的实例。
|
|
|
|
|
|
|
|
|
|
|
|
使用方法而不是函数,除了使用了方法语法和不需要在每个函数签名中重复`self`类型外,其主要好处在于组织性。我将某个类型实例能做的所有事情都一起放入`impl`块中,而不是让将来的用户在我们的代码中到处寻找`Rectangle`的功能。
|
|
|
|
使用方法而不是函数,除了使用了方法语法和不需要在每个函数签名中重复`self`类型外,其主要好处在于组织性。我将某个类型实例能做的所有事情都一起放入`impl`块中,而不是让将来的用户在我们的代码中到处寻找`Rectangle`的功能。
|
|
|
|
|
|
|
|
|
|
|
@ -79,7 +79,7 @@ struct</span>
|
|
|
|
> (&p1).distance(&p2);
|
|
|
|
> (&p1).distance(&p2);
|
|
|
|
> ```
|
|
|
|
> ```
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> 第一行看起来简洁的多。这种自动引用的行为之所以能行得通是因为方法有一个明确的接收者————`self`的类型。在给出接收者和方法名的前提下,Rust 可以明确的计算出方法是仅仅读取(所以需要`&self`),做出修改(所以是`&mut self`)或者是获取所有权(所以是`self`)。Rust 这种使得借用对方法接收者来说是隐式的做法是其所有权系统人体工程学实践的一大部分。
|
|
|
|
> 第一行看起来简洁的多。这种自动引用的行为之所以能行得通是因为方法有一个明确的接收者————`self`的类型。在给出接收者和方法名的前提下,Rust 可以明确的计算出方法是仅仅读取(所以需要`&self`),做出修改(所以是`&mut self`)或者是获取所有权(所以是`self`)。Rust 这种使得借用对方法接收者来说是隐式的做法是其所有权系统程序员友好性实现的一大部分。
|
|
|
|
|
|
|
|
|
|
|
|
<!-- PROD: END BOX -->
|
|
|
|
<!-- PROD: END BOX -->
|
|
|
|
|
|
|
|
|
|
|
|