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
。