我遇到了以下(简化的)示例:
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};
}
}
以下代码无法编译,因为值被捕获为&;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
通常会做相反的事情--说明我们do not想要通过价值来捕捉.这如何解释这里正在发生的事情?
如有任何帮助,不胜感激!