rust - 即使先前借用的是 "forgotten"也无法借用指针吗?

标签 rust borrow-checker

我不明白为什么函数 fn1 无法编译,即 为什么“让 z = &mut x;”之前无法分配 存储在“y”中的引用不再使用(“y”被重新分配 到别的东西)。

此外,为什么fn2fn3在“逻辑上”做同样的事情时编译正常?

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 无效。

关于rust - 即使先前借用的是 "forgotten"也无法借用指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28077309/

相关文章:

generics - 是否可以在 Vec 中存储类型而不是这些类型的实例?

graphics - 我如何在 wgpu 的渲染过程中更改制服?

rust - 将字符串替换为 "null"值作为真正的空值 rusqlite

rust - 在一个表达式中两次借用 self 有时会导致错误

rust - 为什么匹配的可变引用的条件赋值会导致借用错误?

recursion - 在 Rust 中返回一个递归闭包

rust - 为什么函数调用中的尾随逗号不是语法错误?

rust - 如何编写一个可以读写缓存的 rust 函数?

rust - 即使 NLL 打开,循环中的双可变借用错误也会发生

loops - 尝试在循环中更新 Option<&str> 时获取 "temporary value dropped while borrowed"