如何解决获得对不可变变量的可变引用?
这是代码,因为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
参数所期望的类型。但是,我们在这里triggering an implicit reborrow,因此呼叫等效于Foo::mut_ref(&mut *a)
。但是,这种隐式重借并不是使代码正常工作的原因–将可变引用移出a
也将是完全允许的。
尽管a
作为变量是不可变的,但它仍然是可变的引用,因此您可以对它指向的Foo
对象进行突变(假设Foo
具有任何要突变的状态)。您无法获得对a
的可变引用,该引用必须具有类型&mut &mut Foo
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。