其他的库
- https://crates.io/crates/enumflags2
新增加了范型包装, BitFlags 类型不一致。
- https://crates.io/crates/flagset
也是同上,存在类似的问题。
新的实现
现有的类似库,都不太好用。所以就参考 csharp 实现了一版 enum-flags
地址是:https://github.com/mokeyish/enum-flags
在 bitor、 bitand 等运算之后的类型是与原枚举是类型是一样的。
示例代码
use enum_flags::EnumFlags;
#[repr(u8)]
#[derive(EnumFlags, Copy, Clone, PartialEq)]
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); // xor
assert_eq!(e1 & (!Flags::C), Flags::B); // deletion
assert_eq!(e1 - Flags::C, Flags::A); // deletion
assert_eq!("(Flags::A | Flags::C)", format!("{:?}", e1).as_str());
assert!(e1.has_a());
assert!(!e1.has_b());
assert!(e1.has_flag(Flags::C));
}
1
共 4 条评论, 1 页
评论区
写评论想法是好的,但其实这样是 UB:
https://doc.rust-lang.org/reference/behavior-considered-undefined.html
什么bug
--
👇
sanri: 示例代码有bug. 但是这个库看起来还不错.
示例代码有bug. 但是这个库看起来还不错.
看起来挺不错的