为什么“ref”会导致此示例*取消引用*一个字段?

Ale*_*ngs 3 rust

我遇到了以下(简化的)示例:

enum Thing {
    A { value: f32 },
    B { value: f32 },
}


fn main() {

    let mut thing = Thing::A { value: 0. };
    let thing_mut_ref = &mut thing;


    if let Thing::A {value} = thing_mut_ref {
        *thing_mut_ref = Thing::B { value: value * 2.0};
    }   
    
   
}
Run Code Online (Sandbox Code Playgroud)

以下代码无法编译,因为值被捕获为 &mut f32,因此不支持乘以 2.0。

让我惊讶的是,添加ref到匹配的模式突然使其编译,即按值捕获(取消引用value):

enum Thing {
    A { value: f32 },
    B { value: f32 },
}


fn main() {

    let mut thing = Thing::A { value: 0. };
    let thing_mut_ref = &mut thing;


    if let Thing::A {ref value} = thing_mut_ref {
        *thing_mut_ref = Thing::B { value: value * 2.0};
    }   
}
Run Code Online (Sandbox Code Playgroud)

我知道ref通常会做相反的事情 - 表明我们不想按价值捕获。这如何解释这里发生的事情?

caf*_*e25 6

它实际上并不取消引用,而是将可变引用转换为共享引用。正如您从文档中Mul看到的那样,它的实现是为了&f32f32不是为了&mut f32