Por que o Rust permite a mutação através de um campo de referência usando uma ligação imutável?
Se eu tiver uma variável imutável vinculada a uma estrutura, o Rust geralmente não permitirá que eu mude os campos da estrutura ou os campos das estruturas filho de propriedade.
No entanto, se o campo for uma referência mutável, Rustvai permita que eu mude o objeto referido, apesar de minha ligação ser imutável.
Por que isso é permitido? Não é inconsistente com as regras normais de Rust para imutabilidade?
Ferrugemnão deixe-me fazer o mesmo através de uma referência imutável, para que uma referência imutável tenha um comportamento diferente de uma ligação imutável.
Exemplo de código:
struct Bar {
val: i32,
}
struct Foo<'a> {
val: i32,
bar: Bar,
val_ref: &'a mut i32,
}
fn main() {
let mut x = 5;
{
let foo = Foo {
val: 6,
bar: Bar { val: 15 },
val_ref: &mut x
};
// This is illegal because binding is immutable
// foo.val = 7;
// Also illegal to mutate child structures
// foo.bar.val = 20;
// This is fine though... Why?
*foo.val_ref = 10;
let foo_ref = &foo;
// Also illegal to mutate through an immutable reference
//*foo_ref.val_ref = 10;
}
println!("{}", x);
}