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

3

我知道通过按值传递和按引用传递的方式所带来的所有权差异,但是在传递self时我感到困惑。什么情况下我不想让self成为一个引用?

struct Test {}

impl Test {
    fn my_method(&self) {}
}
1个回答

2

不要想太多。如果我们忽略子类型多态性,我们可以把所有面向对象风格的“方法调用”视为“函数调用”,通过在您的大脑中将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]>

2
std::op特质并不是使用移动语义(self)而不是引用(&self)的一个特别好的例子,因为大多数(如果不是全部)实现它们的类型都派生自Copy并使用复制语义而不是移动语义。一个更好的例子是像Vec::into_boxed_slice这样的into转换。对于您的Point结构,您可以使用一个Point到元组的转换,例如fn into_tuple(self) -> (i32, i32) { (self.x, self.y) } - EvilTak
1
@EvilTak 我不同意你对 std::ops::* 的否定。按值传递允许类型重用现有内存。例如,StringVec 都实现了 Add - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接