Obtenir une référence mutable à une variable immuable ?

Aug 19 2020

Voici le code, puisque aest déclaré comme immuable, nous ne pouvons pas obtenir une référence mutable à partir de a, n'est-ce pas ? Mais celui-ci a compilé, pourquoi est-ce?

struct Foo;

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

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

lien de code

Réponses

5 SvenMarnach Aug 19 2020 at 14:07

Le type de la variable aest &mut Foo, c'est-à-dire qu'elle- amême est une référence mutable à un Fooobjet. Muter areviendrait à le faire pointer vers un Fooobjet différent. Puisque alui-même est immuable, vous ne pouvez pas modifier ce vers quoi ail pointe, et votre code ne le réfute en aucune façon.

Votre code passe simplement le &mut Foocomme selfparamètre à mut_ref()- notez que le type de selfest également &mut Foo. Aucun déréférencement automatique ne se produit - aa déjà exactement le type attendu pour le selfparamètre. Cependant, nous déclenchons ici un réemprunt implicite, donc l'appel est équivalent à Foo::mut_ref(&mut *a). Ce réemprunt implicite n'est pas ce qui fait fonctionner le code, cependant - le déplacement de la référence mutable hors de aserait également parfaitement autorisé.

Bien qu'il asoit immuable en tant que variable, il s'agit toujours d'une référence mutable, vous pouvez donc muter l' Fooobjet vers lequel il pointe (en supposant qu'il Fooy ait un état à muter). Vous ne pouvez pas obtenir une référence mutable à a, qui aurait besoin d'avoir le type &mut &mut Foo.