共享引用(shared reference)是Copy的,可变引用是Move的。
在用共享引用存在的时候,所有者也不可能更改变量的值。
引用变量的元素也会自动变成引用的。

一般情况下,引用和取值都需要显示的写明(&a*a),但.操作会自动取值。而且在一个方法需要可变引用的时候也是自动的。即便是引用的引用,也会自动取值。
.一样,指针的比较也会自动取值,如果真的想要比较地址本身需要用专门的函数std::ptr::eq

直接从表达式创建引用,Rust会创建一个匿名的变量。这个变量的生存长度分两种情况:1. 如果该引用被赋予let声明的变量,则匿名变量和该变量的生命周期一样。2. 如果没有复制则器生存长度直到语句的结束。

引用的生命周期

引用的生命周期必须小于其所引用的值的声明周期:

  1. let r = &x; // r的声明周期必须小于x的
  2. f(&x); // f的声明周期必须小于x的,
  3. // 因为f只是一个操作没有没有生命周期,所以要看f内的引用赋值和f的返回值的生命周期。
  4. s = S{r: &x} // s的生命周期必须小于x的

如果省略生命周期参数,则默认所有的参数和返回值有一样的生命周期。如果是方法,则默认返回值的生命周期和self一样。所以如果有不同于默认的情况,就需要写明生命周期参数。

在使用泛型生命周期的时候可以使用类似泛型的subtrait:

  1. fn gl<'a, 'b, T>(a: &'a T, b: &'b T) -> &'a T
  2. where 'a: 'b

泛型里表示a实现了b,也就是说a是b的子类型,也就是说如果一个引用有’a这么长的生命周期,那肯定有’b那么长的生命周期

共享引用和可变引用

image.png
如果一个变量有共享引用,则其上游的变量全都会变成只读。
如果一个变量有可变引用,则其上有的变量全都不可读。