Ownership 101

methods就是第一个参数是self的函数
比如:

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

self有三种形式,主要是有关所有权的:

  • self - Value 完全的所有权
  • &mut self - mutable reference 可修改引用
  • &self - shared reference 共享引用

  • 对于拥有所有权的变量,你可以做:
    移动所有权,借出所有权,销毁,修改,访问内容

  • 对于可修改引用

  • 首先没有所有权,只是引用

  • 可修改,可以访问内容,但是不可移动所有权,借出所有权,销毁 (在链表中尤其要注意这个事情)

  • 第二点一句话概括,就是不能让这个变量处于无效状态

  • 对于共享引用(shared reference)

  • 只能访问内容

  • 其他所有权限都没有

  • 可以同时存在多个共享引用,只能同时存在一个可修改引用(mutable reference)

  • 但是对于共享引用,我们有手段绕开这个限制,对其进行修改,所以共享引用,不称之为不可修改引用( immutable references)