我遇到了以下(简化)示例:
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
通常做相反的事情--声明我们 * 不 * 想通过值来捕获。
1条答案
按热度按时间flvlnr441#
它实际上并不是解引用,而是将可变引用转换为共享引用。