我不明白为什么功能 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);
}
答案 0 :(得分:2)
目前,借用范围是词汇,即它们对应于代码中的大括号。 fn1
就像您fn2
之类的案例一样,a bug to change this就像您在fn3
中看到的那样,现在有解决方法。
对于y
,如果您再次尝试使用error: use of moved value: `*y`
,则会收到此错误:
z = y
这是因为编译器可以告诉(通过语句y
)不再需要z
,从而将可变借位移至y
,使{{1}}无效