首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要在相同枚举之间转换的Rust宏

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

Stack Overflow用户
提问于 2020-01-30 19:13:21
回答 1查看 230关注 0票数 1

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

代码语言:javascript
复制
enum Foo {
  A,
  B,
  C,
  D,
}

enum Bar {
  A,
  B,
  C,
  D,
}

有没有办法使用宏在它们之间自动转换,而不必编写这些繁琐的代码:

代码语言:javascript
复制
let f: Foo = match b {
  Bar::A => Foo::A,
  Bar::B => Foo::B,
  Bar::C => Foo::C,
  Bar::D => Foo::D,
};

加分:有可能对两个完全相同的结构这样做吗?

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 21:37:31

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

代码语言:javascript
复制
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,);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59984712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档