Spe*_*r H 10 enums equality rust
嘿,我正在学习 Rust,并试图找出为什么我不能直接比较一个非常简单的枚举的两个实例,我尝试使用matches!(不起作用)和#[derive(Eq)](只是将问题转发给impl
这是演示我的问题的片段及其输出。
#[derive(Debug)]
pub enum MyEnum {
Enum1,
Enum2,
Enum3
}
#[derive(Debug)]
pub enum ThingEnum {
NoOp,
Enum(MyEnum)
}
pub fn test_enum_equate() {
let mut enum1 = Vec::new();
enum1.push(MyEnum::Enum1);
enum1.push(MyEnum::Enum2);
enum1.push(MyEnum::Enum3);
let mut expr = vec![
ThingEnum::NoOp,
ThingEnum::Enum(MyEnum::Enum1),
ThingEnum::Enum(MyEnum::Enum2),
ThingEnum::NoOp,
ThingEnum::Enum(MyEnum::Enum3)
];
for myenum in enum1.iter() {
for entry in expr.iter() {
match entry {
ThingEnum::NoOp => continue,
ThingEnum::Enum(en) => {
// Check if they are the same
println!("matches!({:?}, {:?}) = {}",
myenum, en, matches!(myenum, en)
);
// Need to implement partial eq, WHY?
// println!("{:?} == {:?} -> {}",
// myenum, en, myenum == en
// );
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
matches!(Enum1, Enum1) = true
matches!(Enum1, Enum2) = true
matches!(Enum1, Enum3) = true
matches!(Enum2, Enum1) = true
matches!(Enum2, Enum2) = true
matches!(Enum2, Enum3) = true
matches!(Enum3, Enum1) = true
matches!(Enum3, Enum2) = true
matches!(Enum3, Enum3) = true
Run Code Online (Sandbox Code Playgroud)
这不是想要的效果。
如果我只使用数字或字符串,这会工作得很好,但我觉得 Enum 的用处应该是没有关联的值,那么为什么这这么难工作呢?
Sil*_*olo 17
Rust 平等有两种形式,PartialEq和Eq。皆Eq是也PartialEq,但反之则不然。具体来说,PartialEq只要求运算是部分等价关系,同时Eq更有力地保证该关系是等价关系。
浮点类型和是浮点类型的一个PartialEq很好的例子,它们都具有不等于其自身的特殊 NaN 值。在哈希图和二叉树等数据结构中,具有不等于自身的值是灾难性的,因此此类数据结构需要类型为,而仅是。去尝试做一个。您很快就会遇到一些编译器错误。Eqf32f64Eqf32PartialEqHashSet<f32>
然而,就您而言,您实际上不需要担心这些。由于您的类型是一个简单的枚举,因此您可以简单地派生和 。PartialEqEq
#[derive(Debug, PartialEq, Eq)]
pub enum MyEnum { ... }
Run Code Online (Sandbox Code Playgroud)
然后==将完全按照您想要的方式工作。