首页 > 解决方案 > 获取对不可变变量的可变引用?

问题描述

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

struct Foo;

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

impl Foo {
    fn mut_ref(&mut self) { }
}

代码链接

标签: rust

解决方案


变量的类型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,它需要具有 type &mut &mut Foo


推荐阅读