我知道通过按值传递和按引用传递的方式所带来的所有权差异,但是在传递self
时我感到困惑。什么情况下我不想让self
成为一个引用?
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_method
是一个简单的函数,它只接受一个参数。当你像这样调用它:testInstance.my_method()
时,实际上是在调用 my_method(testInstance)
,并将 testInstance
作为 self
参数传递。
所以它和其他函数一样。
想想什么时候你希望一个简单的函数参数不是引用,那就是你要回答的问题。
对于 std::vec::Vec
:
fn into_boxed_slice(self) -> Box<[T]>
std::op
特质并不是使用移动语义(self
)而不是引用(&self
)的一个特别好的例子,因为大多数(如果不是全部)实现它们的类型都派生自Copy
并使用复制语义而不是移动语义。一个更好的例子是像Vec::into_boxed_slice
这样的into
转换。对于您的Point
结构,您可以使用一个Point
到元组的转换,例如fn into_tuple(self) -> (i32, i32) { (self.x, self.y) }
。 - EvilTakstd::ops::*
的否定。按值传递允许类型重用现有内存。例如,String
和Vec
都实现了Add
。 - Shepmaster