检查 HashSet 是否包含没有显式值的枚举字段

问题描述 投票:0回答:1

想象一下这段代码(行不通):

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
    }
}

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=bdf723db587a6d6f96d99ef31e45350c

我想检查我的数据集是否包含枚举变体,但不检查其中的特定值。这有可能吗?

rust enums
1个回答
0
投票

这有可能吗?

不适用于哈希集。根据定义,哈希集需要一个值进行哈希(然后测试相等性),因此您无法针对一组值进行测试。

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.