関数fn1がコンパイルされない理由、つまり「let z = &mut x;」の理由がわかりません。"y" に保存されている以前に取得された参照が使用されていない間は、割り当てられません ("y" は別のものに再割り当てされます)。
さらに、fn2とfn3の両方が「論理的に」同じことをしているのに、なぜ両方とも正常にコンパイルされるのでしょうか?
実際、 fn2はfn1とは異なります。「y」は再割り当てではなく範囲外になりますが、「y」が指すものに関してではなく、「y」ポインター ストレージに関してのみ異なります。
実際、 fn3はfn1とは異なり、"z" は "&mut x" から直接割り当てられるのではなく、"y" から割り当てられます。
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);
}