一个方法以self
作为参数和一个方法以&self
或者&mut self
作为参数之间有什么不同?
例如:
impl SomeStruct {
fn example1(self) { }
fn example2(&self) { }
fn example3(&mut self) { }
}
假设我想实现一个方法,将结构体漂亮地打印到标准输出,我应该使用&self
吗?我猜self
也可以用?我不确定什么情况下该使用什么。
一个方法以self
作为参数和一个方法以&self
或者&mut self
作为参数之间有什么不同?
例如:
impl SomeStruct {
fn example1(self) { }
fn example2(&self) { }
fn example3(&mut self) { }
}
假设我想实现一个方法,将结构体漂亮地打印到标准输出,我应该使用&self
吗?我猜self
也可以用?我不确定什么情况下该使用什么。
从书中的示例中(仅将其分成三个单独的段落并标记以使其更清晰):
&self
:我们之所以在函数版本中使用&Rectangle
,是因为我们不想拥有它,只是想读取结构体中的数据而不想写入它。
&mut self
:如果我们想要更改调用方法的实例作为该方法一部分的内容,则会使用&mut self
作为第一个参数。
self
:使用仅使用self
作为第一个参数来拥有实例的方法很少见;通常在该方法将self转换为其他内容并且您希望防止调用者在转换后使用原始实例时使用此技术。
或者换句话说:与 SomeStruct
、&SomeStruct
和 &mut SomeStruct
的区别完全相同。
正如你所看到的,这正是使用假设我想实现一个将结构体打印到标准输出的方法,我应该使用
&self
吗?我猜self
也可以工作?
&self
的情况。如果你使用self
(或者&mut self
),方法很可能仍然可以编译,但只能在更受限制的情况下使用。另一个答案很好,但并不完整。因此,这里有关于self
、&self
和&mut self
的更多信息。
简称 | 等于 | 是否拥有所有权? | 何时使用? | 示例 | |
---|---|---|---|---|---|
self |
self: Self |
a: A |
是 | 调用此方法的代码不应该能够重复使用调用方法的对象。 | 使对象失效,因为可能会将其转换为另一个对象。丢弃一个对象。不可变数据结构? |
&self |
self: &Self |
a: &A |
否-以不变方式借用 | 用于读取self 或其字段。 |
用于打印某些内容或根据其他可复制字段的多个值计算值。 |
&mut self |
self: &mut Self |
a: &mut A |
否-以可变方式借用 | 用于读取或写入self 及其字段。 |
更新数据结构的内部状态的函数。 |
mut self |
mut self: Self |
mut a: A |
是 | 如果要更改self 指向的内容。由于它会拥有所有权,因此并不实用。 |
self
,这在很多情况下都是非常罕见的。相比通常使用的&self
,我认为罕见的事物应该更难写。 - Aart Stuurmanmut self
,因为返回类型是Self
,与&mut self
不匹配。 - Abhijit Sarkar