共享和唯一的借用

Rust 限制了借用值的方式:

  • 在任何给定时间,你都可以有一个或多个 &T 值,或者
  • 你可以有且只有一个 &mut T 值。
fn main() {
    let mut a: i32 = 10;
    let b: &i32 = &a;

    {
        let c: &mut i32 = &mut a;
        *c = 20;
    }

    println!("a: {a}");
    println!("b: {b}");
}
  • 上述代码无法编译,因为 a 同时作为可变值(通过 c)和不可变值(通过 b)被借用。
  • bprintln! 语句移到引入 c 的作用域之前,这段代码就可以编译。
  • 这样更改后,编译器会发现 b 只在通过 ca 进行新可变借用之前使用过。这是借用检查器的一个功能,名为“非词法作用域生命周期”。