6个稳定版本
1.2.0 | 2023年11月21日 |
---|---|
1.1.1 | 2023年4月23日 |
1.0.2 | 2019年12月31日 |
在过程宏中排名1253
每月下载量214
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是一个干净的宏实现,展开成上面的代码,不依赖于任何外部依赖或魔法。