#枚举 #小型 #处理 #变体 #实用工具 #原始类型 #C风格

primitive_enum

处理没有额外数据的枚举类型的小工具

6个稳定版本

1.2.0 2023年11月21日
1.1.1 2023年4月23日
1.0.2 2019年12月31日

过程宏中排名1253

Download history 42/week @ 2024-03-11 13/week @ 2024-03-18 226/week @ 2024-03-25 143/week @ 2024-04-01 185/week @ 2024-04-08 517/week @ 2024-04-15 661/week @ 2024-04-22 225/week @ 2024-04-29 127/week @ 2024-05-06 253/week @ 2024-05-13 62/week @ 2024-05-20 76/week @ 2024-05-27 105/week @ 2024-06-03 31/week @ 2024-06-10 48/week @ 2024-06-17 19/week @ 2024-06-24

每月下载量214

Apache-2.0

24KB
322

rust-primitive_enum

处理C风格枚举类型的小工具

此crate仅导出单个宏 primitive_enum!,它定义了一个由用户指定的原始整数类型支持的枚举。

目的是在模仿传统的C风格枚举的同时,添加一些在此类场景中有用的关联函数(例如遍历每个枚举和转换底层类型)。

示例

#[macro_use] extern crate primitive_enum;

primitive_enum! { MyEnum u16 ;
    A,
    B,
    C,
    D = 500,
    E,       // as you would expect, E maps to 501
}

fn main() {
    use MyEnum::*;

    // Get a slice of all enum elements:
    assert_eq!(
        MyEnum::list(),
        &[A, B, C, D, E],
    );

    // Get the enum value given its integer value:
    assert_eq!(MyEnum::from(0), Some(A));
    assert_eq!(MyEnum::from(1000), None);

    // User specified enum values behave as you would expect
    assert_eq!(D as u16, 500);
    assert_eq!(MyEnum::from(501), Some(E));

    // You can also get an enum by its name
    assert_eq!(MyEnum::from_name("E"), Some(E));
}

展开

截至当前版本,宏

#[macro_use] extern crate primitive_enum;

primitive_enum! { MyEnum u16 ;
    A,
    B,
    C,
    D = 500,
    E,
}

实际上相当于

#[repr(u16)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MyEnum {
    A = 0,
    B = 1,
    C = 2,
    D = 500,
    E = 501,
}

impl MyEnum {
    pub fn from(x: u16) -> Option<MyEnum> {
        // ...
        None
    }

    pub fn from_name(name: &str) -> Option<MyEnum> {
        // ...
        None
    }

    pub fn list() -> &'static [MyEnum] {
        &[
            MyEnum::A,
            MyEnum::B,
            MyEnum::C,
            MyEnum::D,
            MyEnum::E,
        ]
    }
}

文档注释

从版本1.1.0开始,支持文档注释。

primitive_enum! {
/// Some comments about 'MyEnum'
MyEnum u16 ;
    A,
    B,

    /// Some special comments about variant C
    C,
    D = 500,
    E,
}

从版本1.1.0开始,此crate作为一个过程宏实现,以提高生成的代码的空间效率。在版本1.1.0之前,此crate作为一个简单的声明式宏实现。

默认特质

最初,枚举类型不会自动获得Default特质。但从版本1.2.0开始,如果你指定#[default],枚举类型将自动推导出Default特质。

例如,给定

#[macro_use] extern crate primitive_enum;

primitive_enum! {
EnumWithDefault u16 ;
    A,
    B,
    #[default]
    C,
    D,
}

fn main() {
    assert_eq!(EnumWithDefault::default(), EnumWithDefault::C);
}

生成的代码实际上相当于

#[repr(u16)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum EnumWithDefault {
    A = 0,
    B = 1,
    #[default]
    C = 2,
    D = 3,
}

impl EnumWithDefault {
    // ... (same as with the other example above)
}

fn main() {
    assert_eq!(EnumWithDefault::default(), EnumWithDefault::C);
}

此crate是一个干净的宏实现,展开成上面的代码,不依赖于任何外部依赖或魔法。

无运行时依赖