首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习生锈与文献

学习生锈与文献
EN

Stack Overflow用户
提问于 2016-06-03 17:39:43
回答 1查看 282关注 0票数 1

我正在做一个强迫症练习,我面临着这样的问题:

代码语言:javascript
复制
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将我引向以下几个方面:

经测试的物品(及其价值)清单如下:

  • 鸡蛋(1)
  • 花生(2)
  • 贝类(4)
  • 草莓(8)
  • 西红柿(16)
  • 巧克力(32)
  • 花粉(64)
  • 猫(128)

所以如果汤姆对花生和巧克力过敏,他的分数是34分。

它必须是对每个值的某种枚举,以及某种位掩码,但我只是找不到任何文档来向我展示更多关于这些符号的信息。我不愿意放弃,我想尽可能多地了解锈病,但医生似乎缺乏。

有人对枚举、物体、符号有任何建议吗?我在哪里可以获得更多有关锈蚀的文档?

EN

回答 1

Stack Overflow用户

发布于 2016-06-03 17:51:58

锈蚀在语言或标准库中没有位标志类型。但是有一个位标志机箱,你可以写它

代码语言:javascript
复制
#[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是一样的的不同之处在于,我们使用!而不是~来实现位-不。

常量必须在分离模块中定义。

代码语言:javascript
复制
#[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风格的枚举(显式判别的准成员):

代码语言:javascript
复制
enum Allergen {
    Eggs = 1,
    Peanuts = 2,
    ...
    Cats = 128,
}

let score = (Allergen::Peanuts as isize) | (Allergen::Chocolate as isize);

这两种方法都不能表达值形成位标志的概念。说真的,如果你可以使用外部的板条箱,你应该避免使用这些位标志。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37620477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档