首页 文章

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

提问于
浏览
1

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

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

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
}

我've tried a lot of syntax permutations, but I haven' t得到了任何可以编译的东西 . 有没有办法处理enum struct标签,比如,枚举?看起来有一个 FromPrimitive 派生,但它's unstable and doesn' t在struct枚举上工作 .

(如果你不能,我想另一个问题是你是否可以编写一个宏来自动写入匹配) .

2 回答

  • 2

    您可以使用 .. 忽略枚举的所有字段,无论它们有多少,您可以使用 useenum s命名空间内导入变体 . 例如

    enum Foo {
       X { i: u8 },
       Y(u8),
       Z
    }
    
    fn bar(x: Foo) -> u32 {
        use Foo::*;
        match x {
            X { .. } => 100,
            Y(..) => 3,
            Z => 12,
        }
    }
    
  • 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,
            }
        }
    }
    

相关问题