rust 在一个分支中匹配两个枚举变量,使用Option绑定一个变量的字段?

vfh0ocws  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(126)

我想在一个匹配臂中匹配枚举的两个变体。每个变体中有一个字段是“相同的”,这意味着它具有相同的类型,名称和语义。(下面的例子中的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 => (),
    }
}

91zkwejq

91zkwejq1#

您可以使用|将两个变体的field0绑定到同一个绑定中。

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:?}");

相关问题