有没有办法提取枚举的标签,例如,将其用作索引?
我想要一个按枚号类型分类的矢量矢量,即如果我有:
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枚举。
(如果你不能,我想另一个问题是你是否可以写一个宏来自动写相匹配的那个)。
答案 0 :(得分:2)
您可以使用..
忽略枚举的所有字段,无论有多少字段,您都可以使用enum
从use
命名空间内导入变体。 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,
}
}
}