1.3 所有权入门

原文链接: https://rust-unofficial.github.io/too-many-lists/first-ownership.html

既然能构造链表了,最好还能对它做点什么。我们用「普通」(非静态)方法来做。方法在 Rust 里是函数的一种特殊情况,因为有 self 参数,它没有声明类型:

1
2
3
fn foo(self, arg2: Type2) -> ReturnType {
    // 函数体
}

self 主要有三种形式:self、&mut self 和 &self。这三种形式对应 Rust 中所有权的三种主要形式:

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

值代表真正的所有权。你可以对值做任何事:移动它、销毁它、修改它,或通过引用借出它。按值传递时,值会移动到新位置。新位置现在拥有该值,旧位置不能再访问它。因此大多数方法不想要 self——要是操作一下链表它就没了,那也太糟了!

可变引用代表对不属于自己的值的临时独占访问。只要你用完时把它留在有效状态(否则对主人太不礼貌了!),就可以对可变引用指向的值为所欲为。这意味着你甚至可以完全覆盖该值。一个非常有用的特例是交换值,我们会经常用到。&mut 唯一不能做的是在没有替代品的情况下把值移出去。&mut self 很适合想修改 self 的方法。

共享引用代表对不属于自己的值的临时共享访问。因为是共享访问,通常不允许修改任何东西。可以把 & 想象成把值放在博物馆里展示。& 很适合只想观察 self 的方法。

后面我们会看到,在某些情况下可以绕过关于修改的规则。这就是为什么共享引用不叫不可变引用。其实可变引用也可以叫唯一引用,但我们发现把所有权和可变性联系起来,在 99% 的情况下能给出正确的直觉。

最后修改 August 23, 2026: 更新 (499855b16)