6 个版本
0.3.0 | 2022年2月25日 |
---|---|
0.3.0-preview3 | 2022年2月24日 |
0.1.8 | 2021年8月8日 |
0.1.6 |
|
#14 in #flag
2,163 每月下载量
在 2 个crate中使用 (通过 kmip-protocol)
20KB
363 行
EnumFlags
EnumFlags 是一个类似于 C# 的枚举标志实现。
示例
由于使用功能 arbitrary_enum_discriminant
,需要使用 nightly 频道。
#![feature(arbitrary_enum_discriminant)]
use enum_flags::enum_flags;
#[repr(u8)] // default: #[repr(usize)]
#[enum_flags]
#[derive(Copy, Clone, PartialEq)] // can be omitted
enum Flags{
None = 0,
A = 1,
B, // 2
C = 4
}
fn main() {
let e1: Flags = Flags::A | Flags::C;
let e2 = Flags::B | Flags::C;
assert_eq!(e1 | e2, Flags::A | Flags::B | Flags::C); // union
assert_eq!(e1 & e2, Flags::C); // intersection
assert_eq!(e1 ^ e2, Flags::A | Flags::B); // toggle
assert_eq!(e1 & (!Flags::C), Flags::A); // deletion
assert_eq!(e1 - Flags::C, Flags::A); // deletion
assert_eq!(format!("{:?}", e1).as_str(), "(Flags::A | Flags::C)");
assert!(e1.has_a());
assert!(!e1.has_b());
assert!(e1.has_flag(Flags::C));
assert!(e1.contains(Flags::C));
assert_eq!(match Flags::A | Flags::C {
Flags::None => "None",
Flags::A => "A",
Flags::B => "B",
Flags::C => "C",
Flags::__Composed__(v) if v == Flags::A | Flags::B => "A and B",
Flags::__Composed__(v) if v == Flags::A | Flags::C => "A and C",
_ => "Others"
}, "A and C")
}
重大变更
- 在版本 0.18 之前
#[derive(Copy, EnumFlags, Clone, PartialEq)] enum Flags { None = 0, A = 1, B = 2, C = 4 }
- 从版本 0.30 开始
#[enum_flags] #[derive(Copy, Clone, PartialEq)] enum Flags { None = 0, A = 1, B = 2, C = 4 }
依赖项
~1.5MB
~34K SLoC