模式匹配标记的联合枚举的标记

时间:2015-02-08 02:39:48

标签: rust

有没有办法提取枚举的标签,例如,将其用作索引?

我想要一个按枚号类型分类的矢量矢量,即如果我有:

enum Test {
    Point {
        x: i32,
        y: i32,
    },
    Point2 {
        a: i32,
        b: i32,
    },
    Number(i32),
}

我可能想要这样的矢量:

[[Test::Point{1, 2}, Test::Point{3, 4}], [Test::Number(1), Test::Number(2)]] 

我想动态地添加这个给定新值的向量向量。因此,如果函数在Test::Number中传递,它将进入第二个数组。

当然,在最糟糕的情况下,我可以明确地模式匹配每个可能的联合值,但对于大型枚举,它会变得相当冗长和重复,因为所有情况都会最终成为

match e {
    Test::Point { _, _ } => v[0].push(e),
    Test::Point2 { _, _ } => v[1].push(e),
    Test::Number(_) => v[2].push(e),
    // imagine a lot of these
}

我已经尝试了很多语法排列,但我还没有得到任何可编译的东西。有没有办法处理enum struct标签,比如,枚举?看起来有一个FromPrimitive派生,但它不稳定,不适用于struct枚举。

(如果你不能,我想另一个问题是你是否可以写一个宏来自动写相匹配的那个)。

2 个答案:

答案 0 :(得分:2)

您可以使用..忽略枚举的所有字段,无论有多少字段,您都可以使用enumuse命名空间内导入变体。 E.g

enum Foo {
   X { i: u8 },
   Y(u8),
   Z
}

fn bar(x: Foo) -> u32 {
    use Foo::*;
    match x {
        X { .. } => 100,
        Y(..) => 3,
        Z => 12,
    }
}

答案 1 :(得分:0)

您可以在枚举中使用交替语法(通过|)来减少代码重复:

enum Test {
    Point1,
    Point2,
    Point3,
    Point4,
    Number1,
    Number2,
    Number3,
    Number4,
}

impl Test {
    fn bucket(&self) -> u8 {
        use Test::*;
        match *self {
            Point1 | Point2 | Point3 | Point4 => 0,
            Number1 | Number2 | Number3 | Number4 => 1,
        }
    }
}