我正在学习 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”直到最后一行仍然存在? 请帮忙。
虽然 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;如果您在一个作用域内移动变量,或者可变地借用它,则以后将无法借用它。