rust - 如何在rust中传入flags参数?

标签 rust

就像在C中一样,你可以设置一个int参数作为标志,这样你就可以通过执行&操作来知道是否设置了某个标志。当然,我知道在 Rust 中我可以做同样的事情。但有没有更安全、更优雅的方法来做到这一点呢?因为有多组标志,我担心我可能会将它们混淆并设置错误的标志。

最佳答案

您可以使用枚举,为了方便起见,可以选择实现 BitAndBitOr 特征:

#[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));
}

Playground

或者您可以使用 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));
}

Playground link

关于rust - 如何在rust中传入flags参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70473890/

相关文章:

python - 与 Python 代码相比,我如何提高 Rust 代码的性能?

multithreading - 如何将对堆栈变量的引用传递给线程?

rust - Cargo的build和rustc命令之间有什么区别?

string - 在 char 之后查找字符串中的下一个 char 边界索引

rust - 逐字包装辅助函数中的代码会导致借入错误

rust - Rust 编译器使用什么算法来推断生命周期变量?

rust - 如何用Cargo从项目目录外打包源码?

rust - 为什么可能会出现 `#NP` 错误,期望 IDT 条目位于索引 302 处?

collections - 如何从 RwLock-ed 结构中的 RefCell 内的 Hashmap 中删除项目

rust - 如何与 Rust 中的向量元素匹配?