Rust 何时传递self作为方法的引用?

Rust 何时传递self作为方法的引用?,rust,Rust,我理解通过值传递与通过引用传递所带来的所有权差异,但在传递self时,我很难理解这一点。我什么时候不希望self成为参考 struct Test {} impl Test { fn my_method(&self) {} } 不要想太多。如果我们忽略子类型多态性,我们可以通过将a.b(c)转换为b(a,c)来将所有面向对象风格的“方法调用”作为“函数调用”处理 既然你有 struct Test { } impl Test { fn my_method(&self) {

我理解通过值传递与通过引用传递所带来的所有权差异,但在传递
self
时,我很难理解这一点。我什么时候不希望
self
成为参考

struct Test {}

impl Test {
    fn my_method(&self) {}
}

不要想太多。如果我们忽略子类型多态性,我们可以通过将
a.b(c)
转换为
b(a,c)
来将所有面向对象风格的“方法调用”作为“函数调用”处理

既然你有

struct Test { }
impl Test { fn my_method(&self) { } }
my_方法
只是一个接受一个参数的函数,当您像
testInstance.my_方法()
那样调用它时,它实际上是
my_方法(testInstance)
,并且
testInstance
作为
self
传递

因此,其他功能都是一样的。

想一想什么时候你不想让一个简单的函数参数成为一个参考,这就是你要回答的问题

例子 对于
std::vec::vec

fn into_boxed_slice(self) -> Box<[T]>
fn放入盒装切片(自)->Box

std::optraits不是在引用(
&self
)上使用移动语义(
self
)的一个特别好的例子,因为大多数(如果不是全部)实现它们的类型派生
Copy
,并在移动语义上使用复制语义。一个更好的例子是将
转换为类似的
转换。对于你的
结构,你可以使用
到元组的转换,比如
fn到_tuple(self)->(i32,i32){(self.x,self.y)}
@EvilTak我不同意你对
std::ops::*
的解雇。按值获取允许类型重用现有内存。例如,
String
Vec
都实现了
Add