rust - 获取对不可变变量的可变引用?
问题描述
这是代码,由于a
被声明为不可变,我们无法从 获取可变引用a
,对吧?但是这个已经编译了,这是为什么呢?
struct Foo;
fn main() {
let a = &mut Foo;
a.mut_ref();
}
impl Foo {
fn mut_ref(&mut self) { }
}
解决方案
变量的类型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
。