共享引用(shared reference)是Copy的,可变引用是Move的。
在用共享引用存在的时候,所有者也不可能更改变量的值。
引用变量的元素也会自动变成引用的。
一般情况下,引用和取值都需要显示的写明(&a
和*a
),但.
操作会自动取值。而且在一个方法需要可变引用的时候也是自动的。即便是引用的引用,也会自动取值。
和.
一样,指针的比较也会自动取值,如果真的想要比较地址本身需要用专门的函数std::ptr::eq
。
直接从表达式创建引用,Rust会创建一个匿名的变量。这个变量的生存长度分两种情况:1. 如果该引用被赋予let声明的变量,则匿名变量和该变量的生命周期一样。2. 如果没有复制则器生存长度直到语句的结束。
引用的生命周期
引用的生命周期必须小于其所引用的值的声明周期:
let r = &x; // r的声明周期必须小于x的
f(&x); // f的声明周期必须小于x的,
// 因为f只是一个操作没有没有生命周期,所以要看f内的引用赋值和f的返回值的生命周期。
s = S{r: &x} // s的生命周期必须小于x的
如果省略生命周期参数,则默认所有的参数和返回值有一样的生命周期。如果是方法,则默认返回值的生命周期和self一样。所以如果有不同于默认的情况,就需要写明生命周期参数。
在使用泛型生命周期的时候可以使用类似泛型的subtrait:
fn gl<'a, 'b, T>(a: &'a T, b: &'b T) -> &'a T
where 'a: 'b
泛型里表示a实现了b,也就是说a是b的子类型,也就是说如果一个引用有’a这么长的生命周期,那肯定有’b那么长的生命周期
共享引用和可变引用
如果一个变量有共享引用,则其上游的变量全都会变成只读。
如果一个变量有可变引用,则其上有的变量全都不可读。