所有权101

现在我们可以构造一个列表,如果能用它一些事情就更好了。我们用“普通”(非静态)方 法来做这些事情。在Rust中,方法是函数的一种特殊情况,因为self参数没有声明类型:

fn foo(self, arg2: Type2) -> ReturnType {
    // body
}

self可以有3种主要形式:self&mut self&self。这3种形式代表了Rust中所有权 的三种主要形式:

  • self - 值
  • &mut self - 可变引用
  • &self - 共享引用

一个值代表了真正的所有权。你可以对一个值做任何你想做的事情:移动它,销毁它,改变 它,或者通过引用把它借出去。当你用值传递某物时,它就会被移动到新的位置。新的位置 现在拥有这个值,而旧的位置不能再访问它。出于这个原因,大多数方法都不想要self--如 果试图与一个链表一起工作,让它消失,那将是非常蹩脚的!

一个可变引用代表了对一个你不拥有的值的临时独占访问。你可以对一个有可变引用的值做 任何你想做的事情,只要你做完后让它处于有效状态(否则会对所有者不礼貌!)。这意味着 你实际上可以完全覆盖这个值。一个非常有用的特殊情况是将一个值交换另一个值,我们会 经常使用。你唯一不能用&mut做的事情就是把值移出,而不进行替换。对于想要改变self 的方法来说,&mut self是很好的选择。

共享引用代表了对一个你不拥有的值的临时共享访问。因为你有共享访问权,所以一般不允许 你改变任何东西。把&想象成把值放在博物馆里展示。&对于那些只想观察self的方法来 说,是非常好的。

后面我们会看到,在某些情况下,关于改变的规则是可以绕过的。这就是为什么共享引用不叫 不可变引用的原因。真的,可改变的引用可以被称为唯一引用,但我们发现,将所有权与 可改变性联系起来,99%的时候都能给出正确的直觉。