2

関数fn1がコンパイルされない理由、つまり「let z = &mut x;」の理由がわかりません。"y" に保存されている以前に取得された参照が使用されていない間は、割り当てられません ("y" は別のものに再割り当てされます)。

さらに、fn2fn3の両方が「論理的に」同じことをしているのに、なぜ両方とも正常にコンパイルされるのでしょうか?

実際、 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);
}
4

1 に答える 1