可变引用的生命周期

问题描述 投票:0回答:1

我正在学习 Rust 中的借用概念。所以,在这里我发现了一些不全面的东西。

struct A(i32);

fn main() {
    let mut x = A(5);
    let z;
    // first block
    {
        let t = &mut x;
        z = &t.0;
    }
    let p = &x;
    println!("{}", p.0);
    println!("{}", z)
}

我遇到以下错误

   |
22 |         let t = &mut x;
   |                 ------ mutable borrow occurs here
...
26 |     let p = &x;
   |             ^^ immutable borrow occurs here
27 |     println!("{}", p.0);
28 |     println!("{}", z)
   |                    - mutable borrow later used here

我假设在第一个块之后,变量 t 超出了范围。 z 也被视为不可变的引用。然后。为什么 rust 将 z 视为可变引用,或者“t”直到最后一行仍然存在? 请帮忙。

rust borrow-checker
1个回答
0
投票

虽然 z 不是可变借用,但变量 t 可变地借用了另一个块中的变量 x,从而使其被移动。虽然这可能是明智的代码,但借用检查器对其可计算性的限制使得它必须拒绝借用 p,因为该变量已被移至另一个变量,即 t,它拥有 p 的所有权通过可变借用变量。

例如,即使是这个简单的代码(与 rust 的借用检查器等效)也会在编译时给出类似的错误:

fn main() {
    let mut x: i32 = 5;
    let t = &mut x;
    let p = &x;
    println!("{}", p);
    println!("{}", t);
}

将给出以下输出:

 --> src/main.rs:5:13
  |
4 |     let t = &mut x;
  |             ------ mutable borrow occurs here
5 |     let p = &x;
  |             ^^ immutable borrow occurs here
6 |     println!("{}", p);
7 |     println!("{}", t);
  |                    - mutable borrow later used here

TLDR;如果您在一个作用域内移动变量,或者可变地借用它,则以后将无法借用它。

© www.soinside.com 2019 - 2024. All rights reserved.