Rust入门失败之Reference

  • Reference实际只是一个地址
  • 引用不影响所引用的生命周期
  • References must never outlive their referents. 引用生命周期不得超过所引用值.

Shared Reference

  • 可以有多个共享引用
  • 一旦有shared reference, 被引用的Owner变成只读, 不能修改和move.
  • shared reference可以 Copy

Mutable Reference

  • 一旦有可变引用, 除了可变引用衍生出的引用, 不能有其它任何形式的引用访问和修改, 直到可变引用销毁
  • mutable reference不可 Copy

引用规则判断标准

  • 引用类型变量不得超过Owner生存期——引用变量生命周期的上限
  • 存储了引用的变量其引用的Owner生命周期必须至少涵盖到变量的生命周期——Owner生命周期的下限

上限至少包含下限才符合规则! 例如:

1
2
3
4
5
6
7
8
{
let r;
{
let x = 1;
r = &x;
}
assert_eq!(*r, 1); // bad: reads memory `x` used to occupy
}

x的生命周期如下:

Reference 1

而变量 r的生命周期如下:

Reference 2

上限未包含下限, 因此不满足.

Reference 3

r放入内部, OK

Screen Shot 2019-08-19 at 23.53.48

Static引用

  • 所有静态的数据都必须被初始化

  • 可变的静态引用(Mutable statics)默认都非线程安全, 只能在unsafe block内访问可变的静态引用

    1
    2
    3
    4
    5
    6
    7
    static mut STASH: &i32 = &10;

    fn f(p: &'static i32) {
    unsafe {
    STASH = p;
    }
    }

包含引用的复合类型

  • 包含引用的复合类型(如struct)必须声明其生命周期

    1
    2
    3
    4
    5
    6
    7
    struct T<'a> {
    s: S<'a>
    }
    // or
    struct T {
    s: S<'static>
    }
  • self的方法如果返回引用, 默认与self是相同的生命周期

All images are copyrighted by original authors Jim Blandy & Jason Orendorff who wrote in the book Programming Rust.