即使以前的借款被“遗忘”,也无法借用指针?

时间:2015-01-21 21:36:33

标签: rust borrow-checker

我不明白为什么功能 fn1 无法编译,即 为什么“让z =& mut x;”以前无法分配 存储在“y”中的参考文献不再使用(“y”被重新分配 别的什么。)

此外,为什么 fn2 fn3 在“逻辑上”做同样的事情时编译好了?

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);
}

1 个答案:

答案 0 :(得分:2)

目前,借用范围是词汇,即它们对应于代码中的大括号。 fn1就像您fn2之类的案例一样,a bug to change this就像您在fn3中看到的那样,现在有解决方法。

对于y,如果您再次尝试使用error: use of moved value: `*y` ,则会收到此错误:

z = y

这是因为编译器可以告诉(通过语句y)不再需要z,从而将可变借位移至y,使{{1}}无效