Enums 要在相同枚举之间转换的Rust宏

Enums 要在相同枚举之间转换的Rust宏,enums,rust,macros,Enums,Rust,Macros,假设我有两个相同的枚举(不要问为什么): 是否有任何方法可以使用宏在它们之间自动转换,而无需编写此繁琐的代码: let f: Foo = match b { Bar::A => Foo::A, Bar::B => Foo::B, Bar::C => Foo::C, Bar::D => Foo::D, }; 加分:有可能对两个相同的结构执行此操作吗 编辑:一些澄清-至少有一个枚举已经存在于代码中,无法编辑(在我的例子中,它是生成的代码,但也可能来自外部板条

假设我有两个相同的枚举(不要问为什么):

是否有任何方法可以使用宏在它们之间自动转换,而无需编写此繁琐的代码:

let f: Foo = match b {
  Bar::A => Foo::A,
  Bar::B => Foo::B,
  Bar::C => Foo::C,
  Bar::D => Foo::D,
};
加分:有可能对两个相同的结构执行此操作吗

编辑:一些澄清-至少有一个枚举已经存在于代码中,无法编辑(在我的例子中,它是生成的代码,但也可能来自外部板条箱)。我也意识到你可以用proc宏来实现这一点,因为它们基本上可以做任何事情,但我正在寻找一些更简单的东西,如果它存在的话


如果不可能,这也是一个有效的答案。

如果您接受重复一次枚举变量,以下内容可能会有所帮助:

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,);
enum Foo{
A.
B
C
D
}
枚举条{
A.
B
C
D
}
宏规则!convert_enum{($src:ident,$dst:ident,$($variant:ident,)*)=>{
从为$dst执行的impl{
fn from(src:$src)->Self{
匹配src{
$($src::$variant=>Self::$variant,)*
}
}
}
}}
转换枚举!(Foo,Bar,A,B,C,D,);

当然,这可能已经产生了相反的方向。此外,我认为它可以适用于包含更复杂变体的结构或枚举。

为什么使用宏而不是or?所以我们不允许问为什么,您希望在不需要编写转换逻辑的地方使用magic功能@丹尼尔法特:它不是取代了中的
。我想要一个宏从
实现
,我只是不想手工编写冗长的枚举变量列表。@Stargateur:正确。你不明白什么?proc宏,或者定义两个enum和from实现的decl宏是的,这是我想要的,但不必列出
a,B,C,D,
(我有4个以上)。不过这总比没有好,谢谢@Timmmm我知道指定所有备选方案很烦人,但据我所知,Rust's没有提供足够详细的反射机制来自动发现任意枚举的所有备选方案。如果您确信枚举的内存表示形式都是相同的,那么一种替代方法(我将避免)可能是
transmute
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,);