如果我将一个不可变的变量绑定到一个结构体上,Rust通常不允许我修改结构体的字段或拥有的子结构体的字段。
然而,如果该字段是一个可变引用,尽管我的绑定是不可变的,Rust仍然可以允许我对所引用的对象进行修改。
为什么会允许这种情况呢?这不是与Rust对不可变性的正常规则不一致吗?
Rust 不会 允许我通过一个不可变引用做同样的事情,因此不可变引用具有不同的行为方式。
代码示例:
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);
}
*foo.val_ref = 10;
是可接受的,而不是为什么其他的不是。在我看来,似乎我的示例中的任何东西都不应该通过不可变绑定被接受。 - something_clever