【发布时间】:2021-11-10 04:08:17
【问题描述】:
我有这个枚举:
enum MyEnum {
Var1,
Var2(u32),
Var3(u32, u32),
}
我想实现以下行为:
let mut set = HashSet::new();
set.insert(MyEnum::Var1);
set.insert(MyEnum::Var1);
set.insert(MyEnum::Var2(1));
set.insert(MyEnum::Var2(2));
set.insert(MyEnum::Var3(1, 1));
set.insert(MyEnum::Var3(1, 1));
set.insert(MyEnum::Var3(2, 1));
set.insert(MyEnum::Var3(2, 2));
println!("set = {:?}", set);
// set = {Var1, Var2(1), Var2(2), Var3(1, 1), Var3(2, 1)}
也就是说,我想更改变体Var3 的Hash 行为特别,使其仅依赖于其第一个u32。
重要的是,我不想详尽地match 每个枚举变体,因为我想保留所有其他枚举变体的默认行为。因此,据我所知,these answers 不足以满足我的需求。
我想出的解决方案是这样的:
#[derive(Debug, Eq)]
enum MyEnum {
Var1,
Var2(u32),
Var3(u32, u32),
}
impl PartialEq for MyEnum {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(MyEnum::Var3(a, _), MyEnum::Var3(b, _)) => a == b,
_ => format!("{:?}", self) == format!("{:?}", other),
}
}
}
impl Hash for MyEnum {
fn hash<H: Hasher>(&self, state: &mut H) {
match self {
MyEnum::Var3(a, _) => a.hash(state),
_ => format!("{:?}", self).hash(state)
}
}
}
...我正在寻找反馈/更好的解决方案。
【问题讨论】:
标签: rust