不変変数への可変参照を取得しますか?
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
です。