rust 为什么'ref'会导致这个例子 * 解引用 * 一个字段?

8ulbf1ek  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(144)

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

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};
    }   
    
   
}

以下代码无法编译,因为value被捕获为&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};
    }   
}

我知道ref通常做相反的事情--声明我们 * 不 * 想通过值来捕获。

flvlnr44

flvlnr441#

它实际上并不是解引用,而是将可变引用转换为共享引用。

相关问题