Ottenere un riferimento mutabile a una variabile immutabile?

Aug 19 2020

Ecco il codice, poiché aè dichiarato immutabile, non possiamo ottenere un riferimento mutabile da a, giusto? Ma questo è stato compilato, perché è così?

struct Foo;

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

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

collegamento in codice

Risposte

5 SvenMarnach Aug 19 2020 at 14:07

Il tipo della variabile aè &mut Foo, cioè aessa stessa è un riferimento mutabile a un Foooggetto. Mutare asignificherebbe farla puntare a un Foooggetto diverso. Poiché adi per sé è immutabile, non puoi modificare ciò aa cui punta e il tuo codice non lo smentisce in alcun modo.

Il tuo codice passa semplicemente &mut Foocome selfparametro a mut_ref()- nota che anche il tipo di selfè &mut Foo. Non è in corso alcuna dereferenziazione automatica: aha già esattamente il tipo previsto per il selfparametro. Tuttavia, qui stiamo attivando un reborrow implicito , quindi la chiamata è equivalente a Foo::mut_ref(&mut *a). Tuttavia, questo reborrow implicito non è ciò che fa funzionare il codice: anche lo spostamento del riferimento mutabile fuori da asarebbe perfettamente consentito.

Sebbene asia immutabile come variabile, è comunque un riferimento mutabile, quindi puoi mutare l' Foooggetto a cui punta (supponendo che Fooabbia uno stato da mutare). Non è possibile ottenere un riferimento mutabile a a, che dovrebbe avere il tipo &mut &mut Foo.