8个稳定版本
1.0.7 | 2023年1月5日 |
---|---|
1.0.5 | 2022年12月27日 |
#212 在 进程宏
每月下载量 31
34KB
718 行
EnumBitFlags
Rust的进程宏crate,允许创建位标志枚举。
如何使用
- 首先,您需要将此crate添加到您的
cargo.toml
文件中
[dependencies]
EnumBitFlags = "1.0.7"
- 然后,您可以在您的Rust项目中像这样使用它
#[EnumBitFlags]
enum MyFlags {
Flag_1 = 0x0001,
Flag_2 = 0x0002,
Flag_3 = 0x0004
}
fn main() {
let flags = MyFlags::Flag_1 | MyFlags::Flag_2;
// check if a flag is set (via .contains(...) method)
if flags.contains(MyFlags::Flag_1) {
println!("Flag_1 is present");
}
// check if a flag is set (via AND operation)
if (flags & MyFlags::Flag_2) == MyFlags::Flag_2 {
println!("Flag_2 is present");
}
}
参数
EnumBitFlags支持各种参数,这些参数提供了关于如何构建枚举的额外信息。参数在 EnumBitFlags
参数中以以下格式指定:key=value,key=value,...
。或者,您可以使用 :
代替 =
(key:value, key:value....
)
-
bits
位字段的内存表示。它可以是以下之一:8
、16
、32
、64
或128
。如果未指定,则默认值为32
。 示例#[EnumBitFlags(bits=8)] enum MyFlags { Flag_1 = 0x01, Flag_2 = 0x02, Flag_3 = 0x04 }
-
empty
空变体的名称。空变体是未设置任何位的情况。如果未指定,将生成None
。空变体的名称不得出现在枚举变体中,并且必须以字母或下划线字符开头,可以包含字母、数字和下划线字符。 示例#[EnumBitFlags(empty=Nothing)] enum MyFlags { Flag_1 = 1, Flag_2 = 2, Flag_3 = 4 } fn main() { let f = MyFlags::Nothing; }
-
disable_empty_generation
禁用生成空(值0)变体。默认情况下,这是None
,但可以使用empty
属性来更改名称。此属性还将禁用任何手动变体(例如No_flag = 0
) 示例#[EnumBitFlags(disable_empty_generation=true)] enum MyFlags { Flag_1 = 1, Flag_2 = 2, Flag_3 = 4 } fn main() { let f = MyFlags::None; // this code will produce an error as variant None will not be generated }
debug
将在解析后打印出结果结构。 示例
#[EnumBitFlags(debug=true)] enum MyFlags { Flag_1 = 1, Flag_2 = 2, Flag_3 = 4 }
方法
每个 EnumBitFlags 都有几个方法,可以用来轻松地操纵和检查位状态
方法 | 描述 |
---|---|
obj.contains(mask) | 如果对象中包含掩码的所有设置位,则返回 true ,否则返回 false |
obj.contains_one(mask) | 如果对象中至少包含掩码中的一个位,则返回 true ,否则返回 false |
obj.clear() | 清除当前对象中的所有位 |
obj.is_empty() | 如果没有设置位,则返回 true ,否则返回 false |
obj.remove(mask) | 移除掩码中的所有设置标志 |
obj.set(mask) | 设置掩码中的所有位 |
obj.get_value() | 返回与位掩码标志关联的数值 |
-
contains
检查是否包含确切的位标志掩码fn contains(&self, obj: <EnumName>) -> bool
obj 不能为空(至少要设置一个位),并且对象中的所有位都必须存在。示例
#[EnumBitFlags] enum MyFlags { A = 1, B = 2, C = 4 } fn main() { let t = MyFlags::A | MyFlags::B; if t.contains(MyFlags::A) { /* this code will be executed */ } if t.contains(MyFlags::A | MyFlags::B) { /* this code will be executed */ } if t.contains(MyFlags::A | MyFlags::C) { /* this code WILL NOT BE REACHED as flags C is not set in variable t */ } }
-
contains_one
检查对象中是否至少包含掩码中的一个位fn contains_one(&self, mask: <EnumName>) -> bool
obj 不能为空(至少要设置一个位)。示例
#[EnumBitFlags] enum MyFlags { A = 1, B = 2, C = 4 } fn main() { let t = MyFlags::A | MyFlags::B; if t.contains_one(MyFlags::A) { /* this code will be executed */ } if t.contains_one(MyFlags::A | MyFlags::B) { /* this code will be executed */ } if t.contains_one(MyFlags::A | MyFlags::C) { /* this code will be executed */ } }
-
clear
清除枚举中的所有位fn clear(&mut self)
示例
#[EnumBitFlags] enum MyFlags { A = 1, B = 2, C = 4 } fn main() { let mut t = MyFlags::A | MyFlags::B; if t.contains_one(MyFlags::A) { /* this code will be executed */ } t.clear(); if t.contains(MyFlags::A) { /* this code will NOT BE REACHED as t was cleared */ } }