Rust 何时使用self&;自我,;方法中的mut self?

Rust 何时使用self&;自我,;方法中的mut self?,rust,Rust,采用self的方法与采用&self甚至&mut self的方法有什么区别 例如 impl SomeStruct{ fn示例1(自){} fn示例2(&self){} fn示例3(&mut self){} } 假设我想实现一个将结构漂亮地打印到stdout的方法,我应该采用&self?我想self也可以吗?我不确定什么时候该用什么。来自示例(只需分成三个单独的段落,并标记以使其更清楚): &self:我们在这里选择了&self,原因与我们在函数版本中使用&Rectangle的原因相同:我们不想拥

采用
self
的方法与采用
&self
甚至
&mut self
的方法有什么区别

例如

impl SomeStruct{
fn示例1(自){}
fn示例2(&self){}
fn示例3(&mut self){}
}
假设我想实现一个将结构漂亮地打印到stdout的方法,我应该采用
&self
?我想
self
也可以吗?我不确定什么时候该用什么。

来自示例(只需分成三个单独的段落,并标记以使其更清楚):

&self
:我们在这里选择了
&self
,原因与我们在函数版本中使用
&Rectangle
的原因相同:我们不想拥有所有权,我们只想读取结构中的数据,而不是写入它

&mut self
:如果我们想更改调用该方法的实例,作为该方法的一部分,我们将使用
&mut self
作为第一个参数

self
:很少有方法只使用
self
作为第一个参数来获取实例的所有权;当方法将self转换为其他对象,并且您希望防止调用方在转换后使用原始实例时,通常使用此技术

或者换句话说:区别与
SomeStruct
&SomeStruct
&mut SomeStruct
完全相同

假设我想实现一个将结构漂亮地打印到stdout的方法,我应该采用
&self
?我想
self
也可以吗


如您所见,这正是
&self
的情况。如果您使用
self
(或
&mut self
),该方法可能仍会编译,但它只能在更受限制的情况下使用。

我明白了。对我来说,有点奇怪,这里的默认值不是不可变的引用(或者实际上是任何参数),我有点用词不对;这并不是一个默认值。但是最简单的编写方法就是
self
,根据文档,这是非常罕见的。我认为,与通常使用的(
&self
)相比,罕见的东西更难编写。这实际上同样适用于非
self
参数(正如您在开始时提到的)。我刚刚注意到,我最初忽略了问题最后一部分的答案,添加了它。@AlexeyRomanov如果它是库的公共API的一部分,您应该在文档中有使用它的测试和示例,这样您就有可能自己发现这个问题。