【问题标题】:Convert enum to BTreeMap?将枚举转换为 BTreeMap?
【发布时间】:2015-02-01 15:23:42
【问题描述】:

我可以将枚举转换为 TreeMap 吗?

enum En1 {
  val1, 
  val2, 
  val3
}

fn fn1() -> BTreeMap<String, En1> {
  let mut map = BTreeMap::new();
   //iterate through En1 somehow

   // now map is: "val1" -> val1, "val2" -> val2, "val3" -> val3
   map
}

我的意思是,使用 DRY 是最简单的方法。

【问题讨论】:

    标签: rust


    【解决方案1】:

    编辑:实际上,这是一个更好的版本,它应该更有效和更通用。此外,您可以将宏重新用于其他枚举 (playpen link)。

    #![feature(core)] // IO is currently in flux.
    
    use std::collections::BTreeMap;
    
    macro_rules! symbolic_enum {
        ($enum_name:ident { $($variant:ident,)* }) => {
            #[derive(Copy, Clone, Debug)]
            enum $enum_name {
                $($variant,)*
            }
    
            impl $enum_name {
                pub fn values() -> &'static /*'*/ [$enum_name] {
                    use self::$enum_name::*;
                    const VALUES: &'static /*'*/ [$enum_name] = &[$($variant),*];
                    VALUES
                }
    
                pub fn names() -> &'static /*'*/ [&'static /*'*/ str] {
                    const NAMES: &'static /*'*/ [&'static /*'*/ str] = &[$(stringify!($variant)),*];
                    NAMES
                }
    
                pub fn items() -> &'static /*'*/ [(&'static /*'*/ str, $enum_name)] {
                    use self::$enum_name::*;
                    const ITEMS: &'static /*'*/ [(&'static /*'*/ str, $enum_name)] = &[
                        $((stringify!($variant), $variant)),*
                    ];
                    ITEMS
                }
            }
        }
    }
    
    symbolic_enum! {
        En1 {
            Val1,
            Val2,
            Val3,
        }
    }
    
    fn main() {
        println!("{:?}", En1::values());
        println!("{:?}", En1::names());
        println!("{:?}", En1::items());
        let map: BTreeMap<_, _> = En1::items().iter().cloned().collect();
        println!("{:?}", map);
    }
    

    原文:这是我能想到的最短的(playpen link):

    #![feature(core)] // IO is currently in flux.
    
    use std::collections::BTreeMap;
    
    #[derive(Copy, Clone, Debug)]
    enum En1 {
        Val1, 
        Val2, 
        Val3,
    }
    
    // /*'*/ is to fix syntax highlighting
    const EN1_VALUES: &'static /*'*/ [En1] = &[En1::Val1, En1::Val2, En1::Val3];
    
    impl En1 {
        pub fn values() -> &'static /*'*/ [En1] {
            EN1_VALUES
        }
    
        pub fn as_map() -> BTreeMap<String, En1> {
            En1::values().iter().cloned().map(|e| (format!("{:?}", e), e)).collect()
        }
    }
    
    fn main() {
        println!("{:?}", En1::as_map());
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多