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);
}

questionAnswers(1)

yourAnswerToTheQuestion