不変変数への可変参照を取得しますか?

Aug 19 2020

これaがコードです。は不変として宣言されているため、から可変参照を取得することはできませんaよね?しかし、これはコンパイルされました、それはなぜですか?

struct Foo;

fn main() {
    let a = &mut Foo;
    a.mut_ref();
}

impl Foo {
    fn mut_ref(&mut self) { }
}

コードリンク

回答

5 SvenMarnach Aug 19 2020 at 14:07

変数の型はaです&mut Foo。つまり、aそれ自体がFooオブジェクトへの可変参照です。変更aとは、別のFooオブジェクトを指すようにすることを意味します。それa自体は不変であるaため、指しているものを変更することはできず、コードはこれを決して反証しません。

コードは単にパラメータ&mut Fooとしてをに渡しselfますmut_ref()–のタイプselfもであることに注意してください&mut Foo。自動逆参照は発生していません–aすでにselfパラメーターに指定されているタイプとまったく同じです。ただし、ここでは暗黙的な再借用をトリガーしているため、呼び出しはと同等Foo::mut_ref(&mut *a)です。ただし、この暗黙的な再借用は、コードを機能させるものではありません。可変参照を移動するaことも完全に許可されます。

一方でa変数として不変であるあなたが変異することができますので、それは、まだ変更可能な参照だFoo、それは(仮定を指しているのオブジェクトFoo突然変異する任意の状態を持っていたが)。への変更可能な参照を取得することはできません。aこれには、タイプが必要&mut &mut Fooです。