这是代码,因为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)
变量的类型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
。
归档时间: |
|
查看次数: |
57 次 |
最近记录: |