我正在做一个强迫症练习,我面临着这样的问题:
fn test_no_allergies_means_not_allergic() {
let allergies = Allergies::new(0);
assert_eq!(false, allergies.is_allergic_to(&Allergen::Peanuts));
assert_eq!(false, allergies.is_allergic_to(&Allergen::Cats));
assert_eq!(false, allergies.is_allergic_to(&Allergen::Strawberries));
}当我查看Allergen::Peanuts时,我认为这是一个类似于Ruby的符号,但是除了板条箱和模块的概念之外,我在文档中找不到任何关于它的东西。我似乎不认为Allergen是一个有独立板条箱的模块,主要是因为README将我引向以下几个方面:
经测试的物品(及其价值)清单如下:
所以如果汤姆对花生和巧克力过敏,他的分数是34分。
它必须是对每个值的某种枚举,以及某种位掩码,但我只是找不到任何文档来向我展示更多关于这些符号的信息。我不愿意放弃,我想尽可能多地了解锈病,但医生似乎缺乏。
有人对枚举、物体、符号有任何建议吗?我在哪里可以获得更多有关锈蚀的文档?
发布于 2016-06-03 17:51:58
锈蚀在语言或标准库中没有位标志类型。但是有一个位标志机箱,你可以写它
#[macro_use] extern crate bitflags;
bitflags! {
flags Allergies: u32 {
const ALLERGEN_EGGS = 1,
const ALLERGEN_PEANUTS = 2,
...
const ALLERGEN_CATS = 128,
}
}
impl Allergies {
pub fn is_allergic_to(&self, other: &Allergies) -> bool {
self.intersects(*other)
}
}
let allergies = Allergies::empty();
assert!(!allergies.is_allergic_to(&ALLERGEN_CATS));
// ^ unfortunately we don't support associated constants
// so we have to name it ALLERGEN_CATS instead of Allergies::CATS.
assert_eq!((ALLERGEN_PEANUTS | ALLERGEN_CHOCOLATE).bits(), 34);不要忘记将bitflags添加到Cargo.toml中的[dependency]部分。
如果不希望依赖外部机箱,则可以将类型与按位操作结合起来。它们和C是一样的的不同之处在于,我们使用!而不是~来实现位-不。
常量必须在分离模块中定义。
#[allow(non_upper_case_globals)] // <- silence 8 warnings
mod Allergen {
pub const Eggs: u32 = 1; // <- use a new type if you like
pub const Peanuts: u32 = 2;
...
pub const Cats: u32 = 128;
}或者作为C风格的枚举(显式判别的准成员):
enum Allergen {
Eggs = 1,
Peanuts = 2,
...
Cats = 128,
}
let score = (Allergen::Peanuts as isize) | (Allergen::Chocolate as isize);这两种方法都不能表达值形成位标志的概念。说真的,如果你可以使用外部的板条箱,你应该避免使用这些位标志。
https://stackoverflow.com/questions/37620477
复制相似问题