我想在一个匹配臂中匹配枚举的两个变体。每个变体中有一个字段是“相同的”,这意味着它具有相同的类型,名称和语义。(下面的例子中的field0: i32
。)我想绑定一个本地&mut i32
到给定变体的field0
。一个变体也有一个不被另一个“共享”的字段。(示例中的field1: String
。)我想将其绑定到本地Option<&mut String>
。有没有一种简洁的方法来做到这一点?
enum Enum {
Variant0 { field0: i32, field1: String },
Variant1 { field0: i32 },
Variant2,
}
fn mutate(value: &mut Enum) {
match value {
// Hopefully some pattern matching magic
// to get a local &mut i32 and a local
// Option<&mut String>.
}
}
fn main() {
mutate(&mut Enum::Variant0 {
field0: 123,
field1: "hello".to_string(),
});
mutate(&mut Enum::Variant1 { field0: 456 });
}
字符串
这是迄今为止我所知道的最好的选择:
fn mutate(value: &mut Enum) {
match value {
Enum::Variant0 { field0, .. } | Enum::Variant1 { field0 } => {
// Mutate *field0 here.
if let Enum::Variant0 { field1, .. } = value {
// Mutate *field1 here.
}
}
Enum::Variant2 => (),
}
}
型
1条答案
按热度按时间91zkwejq1#
您可以使用
|
将两个变体的field0
绑定到同一个绑定中。字符串
但是,您对
field1
的其他需求并不真正适合这种语法,因此您需要手动完成它。如果您只需要一个&
引用,您可以在两个匹配表达式中完成它,但这不太可能更漂亮。型