【问题标题】:Obtain a mutable reference to a immutable variable?获取对不可变变量的可变引用?
【发布时间】:2020-12-08 06:49:29
【问题描述】:

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

struct Foo;

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

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

code-link

【问题讨论】:

  • 您实际上并没有在此代码中获得对a 的可变引用,但这仍然是一个好问题。我知道它这样,但我无法机械地解释它。

标签: rust


【解决方案1】:

变量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 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多