假设我有这两个相同的枚举(不要问为什么):
enum Foo {
A,
B,
C,
D,
}
enum Bar {
A,
B,
C,
D,
}有没有办法使用宏在它们之间自动转换,而不必编写这些繁琐的代码:
let f: Foo = match b {
Bar::A => Foo::A,
Bar::B => Foo::B,
Bar::C => Foo::C,
Bar::D => Foo::D,
};加分:有可能对两个完全相同的结构这样做吗?
编辑:几点说明--至少有一个枚举已经存在于代码中,不能被编辑(在我的例子中,它是生成的代码,但也可以来自外部的机箱)。我也意识到你可以用proc宏来做到这一点,因为它们基本上可以做任何事情,但我正在寻找更简单的东西,如果它存在的话。
如果不可能,这也是一个有效的答案。
发布于 2020-01-30 21:37:31
如果您接受重复一次枚举变体,则以下内容可能会有所帮助:
enum Foo {
A,
B,
C,
D,
}
enum Bar {
A,
B,
C,
D,
}
macro_rules! convert_enum{($src: ident, $dst: ident, $($variant: ident,)*)=> {
impl From<$src> for $dst {
fn from(src: $src) -> Self {
match src {
$($src::$variant => Self::$variant,)*
}
}
}
}}
convert_enum!(Foo, Bar, A, B, C, D,);当然,这可能已经产生了相反的方向。此外,我认为它可以适用于包含更复杂变体的结构或枚举。
https://stackoverflow.com/questions/59984712
复制相似问题