rust - 匹配一只 ARM 中的两个枚举变体,使用 Option? 绑定(bind)一个变体的字段?

标签 rust enums pattern-matching

我想在一个匹配臂中匹配枚举的两个变体。每个字段中有一个字段是“相同”的,这意味着它具有相同的类型、名称和语义。 (下面示例中的 field0: i32 。)我想将本地 &mut i32 绑定(bind)到给定变体的 field0 。一种变体还具有不与另一种变体“共享”的字段。 (示例中的 field1: String 。)我想将其绑定(bind)到本地 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 });
}

最佳答案

您可以使用 | 将两个变体的 field0 放入同一绑定(bind)中。

match value {
    Variant0 { field0, .. } | Variant1 { field0 } => println!("{field0}"),
    _ => (),
}

但是,您对 field1 的其他要求并不真正适合此语法,因此您需要手动执行。如果您只需要 & 引用,则可以在两个匹配表达式中完成,但这不太可能更漂亮。

let (field0, field1) = match value {
    Variant0 { field0, field1 } => (field0, Some(field1)),
    Variant1 { field0 } => (field0, None),
    Variant2 => return,
};
println!("{field0}, {field1:?}");

关于rust - 匹配一只 ARM 中的两个枚举变体,使用 Option? 绑定(bind)一个变体的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76190619/

相关文章:

objective-c - 基于另一个枚举 : String 在 Swift 中创建一个枚举,可导出到 ObjC

rust - 匹配子模式中的或运算符

java - 正则表达式从字符串中提取以逗号分隔的字符串

sql - 查找列数最少的行与模式匹配

rust - Rust 中的引用分配

ssl - 构建带 cargo 的箱子时 SSL 证书无效

c++ - C++ 中的 Typedef 枚举

Java - 枚举 - 逻辑循环引用

rust - mutex.lock是否需要提前结束其生命周期?

rust - 为什么要尝试!()和?在不返回Option或Result的函数中使用时无法编译?