想象一下这段代码(行不通):
use std::collections::HashSet;
#[derive(PartialEq, Hash, Eq)]
pub enum SomeEnum {
One(u32),
Two(u32),
}
fn main() {
use SomeEnum::*;
let set = HashSet::from([One(123), Two(321)]);
if set.contains(&One) {
// do something
}
}
我想检查我的数据集是否包含枚举变体,但不检查其中的特定值。这有可能吗?
这有可能吗?
不适用于哈希集。根据定义,哈希集需要一个值进行哈希(然后测试相等性),因此您无法针对一组值进行测试。
使用 btree 集这是可能的:btree 支持范围请求,因此您可以从您正在查找的变体的最低值开始获取范围,并查看第一个条目是否是预期的变体,或者获取整个变体的范围并查看它是否非空:https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=72e3051c8f8a99206729cce4305ff153
println!("lower bound, check for first value");
println!("\thas a one? {}", matches!(set.range(One(0)..).next(), Some(One(_))));
println!("\thas a three? {}", matches!(set.range(Three(0)..).next(), Some(Three(_))));
println!("full bounds, check for any value");
println!("\thas a one? {}", set.range(One(0)..=One(u32::MAX)).next().is_some());
println!("\thas a three? {}", set.range(Three(0)..=Three(u32::MAX)).next().is_some());
lower bound, check for first value
has a one? true
has a three? false
full bounds, check for any value
has a one? true
has a three? false