即使之前的借用是 "forgotten" 也不能借用指针?

Cannot borrow pointer even if previous borrow is "forgotten"?

我不明白为什么函数 fn1 不能编译,即 为什么 "let z = &mut x;" 之前不能赋值 不再使用存储在 "y" 中的引用("y" 已重新分配 到别的地方)。

此外,为什么 fn2fn3 在做 "logically" 相同的事情时编译正常?

fn2 实际上不同于 fn1,"y" 超出范围而不是重新分配,但这是 仅在 "y" 指针存储方面不同,与 "y" 指向的内容无关。

fn3 实际上不同于 fn1,"z" 是从 "y" 赋值的,而不是直接从"&mut x".

fn fn1() {
    let mut x = 1i32;
    let mut somethingelse = 7i32;
    let mut y = &mut x;
    *y = *y + 1;
    println!("y = {}", *y);
    y = &mut somethingelse;
    println!("just something: {}", *y);
    // y is not used anymore...
    let z = &mut x;
    *z = *z + 1;
    println!("z = {}", *z);
}

fn fn2() {
    let mut x = 1i32;
    {
        let y = &mut x;
        *y = *y + 1;
        println!("y = {}", *y);
    }
    let z = &mut x;
    *z = *z + 1;
    println!("z = {}", *z);
}

fn fn3() {
    let mut x = 1i32;
    let z;
    let y = &mut x;
    *y = *y + 1;
    println!("y = {}", *y);
    z = y;
    *z = *z + 1;
    println!("z = {}", *z);
}

目前,借用范围是词法的,即它们对应于代码中的大括号。 a bug to change this 可以解决像您的 fn1 这样的情况,但就像您在 fn2 中看到的那样,目前有解决方法。

对于fn3,如果你再次尝试使用y,你会得到这个错误:

error: use of moved value: `*y`

这是因为编译器可以告诉(通过语句 z = y)不再需要 y,因此将可变借用移动到 z,使得 y无效。