我遇到了以下(简化的)示例:
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通常会做相反的事情 - 表明我们不想按价值捕获。这如何解释这里发生的事情?
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |