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