获取对不可变变量的可变引用?

TEN*_*ENX 1 rust

这是代码,因为a被声明为不可变的,我们不能从 获取可变引用a,对吧?但是这个已经编译过了,这是为什么呢?

struct Foo;

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

impl Foo {
    fn mut_ref(&mut self) { }
}
Run Code Online (Sandbox Code Playgroud)

代码链接

Sve*_*ach 5

变量的类型a&mut Foo,即a它本身是一个Foo对象的可变引用。变异a意味着使它指向不同的Foo对象。由于a它本身是不可变的,因此您无法更改所a指向的内容,并且您的代码不会以任何方式反驳这一点。

您的代码只是将&mut Foo作为self参数传递给mut_ref()- 请注意,的类型self也是&mut Foo。没有发生自动取消引用 -a已经完全具有self参数的类型。但是,我们在这里触发了隐式重新借用,因此调用等效于Foo::mut_ref(&mut *a)。但是,这种隐式重新借用并不是使代码工作的原因——a也完全允许将可变引用移出。

虽然a作为变量是不可变的,但它仍然是可变引用,因此您可以改变Foo它指向的对象(假设Foo有任何要改变的状态)。您无法获得对 的可变引用a,而该引用需要具有 类型&mut &mut Foo