就像在C中一样,你可以设置一个int参数作为标志,这样你就可以通过执行&操作来知道是否设置了某个标志。当然,我知道在 Rust 中我可以做同样的事情。但有没有更安全、更优雅的方法来做到这一点呢?因为有多组标志,我担心我可能会将它们混淆并设置错误的标志。
最佳答案
您可以使用枚举,为了方便起见,可以选择实现 BitAnd
和 BitOr
特征:
#[repr(u8)]
enum Flags {
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
}
impl Flags {
pub fn is_set(self, flags: u8) -> bool {
flags & self as u8 != 0
}
}
impl std::ops::BitAnd for Flags {
type Output = u8;
fn bitand(self, rhs: Self) -> Self::Output {
self as u8 & rhs as u8
}
}
impl std::ops::BitOr for Flags {
type Output = u8;
fn bitor(self, rhs: Self) -> Self::Output {
self as u8 | rhs as u8
}
}
fn main() {
let flags = 0b11111111u8 & (Flags::Flag1 | Flags::Flag3);
println!("{}", Flags::Flag1.is_set(flags));
println!("{}", Flags::Flag2.is_set(flags));
println!("{}", Flags::Flag3.is_set(flags));
}
或者您可以使用 Bitflags为您实现这一切的 crate :
use bitflags::bitflags;
bitflags! {
struct Flags: u32 {
const FLAG1 = 0b00000001;
const FLAG2 = 0b00000010;
const FLAG3 = 0b00000100;
const FLAGS_ALL = Self::FLAG1.bits | Self::FLAG2.bits | Self::FLAG3.bits;
}
}
impl Flags {
fn is_set(self, flag: Self) -> bool {
self & flag == flag
}
}
fn main() {
let flags = Flags::FLAG1 | Flags::FLAG3;
println!("{}", flags.is_set(Flags::FLAG1));
println!("{}", flags.is_set(Flags::FLAG2));
println!("{}", flags.is_set(Flags::FLAG3));
}
关于rust - 如何在rust中传入flags参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70473890/