¿Obtener una referencia mutable a una variable inmutable?
Aquí está el código, dado a
que 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
El tipo de la variable a
es &mut Foo
, es decir, a
en sí misma es una referencia mutable a un Foo
objeto. Mutar a
significaría hacer que apunte a un Foo
objeto diferente. Dado que a
en sí mismo es inmutable, no puede cambiar lo a
que apunta, y su código no lo refuta de ninguna manera.
Su código simplemente pasa &mut Foo
como self
parámetro a mut_ref()
: tenga en cuenta que el tipo de self
también es &mut Foo
. No se está eliminando la referencia automática: a
ya tiene exactamente el tipo esperado para el self
pará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; a
también se permitiría perfectamente sacar la referencia mutable.
Si bien a
es inmutable como variable, sigue siendo una referencia mutable, por lo que puede mutar el Foo
objeto al que apunta (suponiendo Foo
que tenga algún estado para mutar). No puede obtener una referencia mutable a a
, que debería tener el tipo &mut &mut Foo
.