¿Obtener una referencia mutable a una variable inmutable?

Aug 19 2020

Aquí está el código, dado aque se declara inmutable, no podemos obtener una referencia mutable de a, ¿verdad? Pero este ha compilado, ¿por qué es eso?

struct Foo;

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

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

enlace de código

Respuestas

5 SvenMarnach Aug 19 2020 at 14:07

El tipo de la variable aes &mut Foo, es decir, aen sí misma es una referencia mutable a un Fooobjeto. Mutar asignificaría hacer que apunte a un Fooobjeto diferente. Dado que aen sí mismo es inmutable, no puede cambiar lo aque apunta, y su código no lo refuta de ninguna manera.

Su código simplemente pasa &mut Foocomo selfparámetro a mut_ref(): tenga en cuenta que el tipo de selftambién es &mut Foo. No se está eliminando la referencia automática: aya tiene exactamente el tipo esperado para el selfparámetro. Sin embargo, aquí activamos un préstamo implícito , por lo que la llamada es equivalente a Foo::mut_ref(&mut *a). Sin embargo, este préstamo implícito no es lo que hace que el código funcione; atambién se permitiría perfectamente sacar la referencia mutable.

Si bien aes inmutable como variable, sigue siendo una referencia mutable, por lo que puede mutar el Fooobjeto al que apunta (suponiendo Fooque tenga algún estado para mutar). No puede obtener una referencia mutable a a, que debería tener el tipo &mut &mut Foo.