2

我不明白为什么函数fn1不能编译,即为什么 "let 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);
}
4

1 回答 1

2

目前,借用范围是词法的,即它们对应于代码中的大括号。有一个错误可以改变它以解决像你这样的情况fn1,但就像你在 中看到的那样fn2,现在有解决方法。

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

error: use of moved value: `*y`

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

于 2015-01-21T22:10:02.407 回答