如何在Rust中比较枚举实例

9

嘿,我正在学习 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
                    // );
                }
            }
        }
    }
}

输出结果为:

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

这不是期望的效果。
如果我只使用数字或字符串,那么这将很好地工作,但我觉得枚举的有用之处应在于没有相关联的值,那么为什么这样做会很困难呢?
1个回答

15
Rust中的相等性有两种形式,即PartialEqEq。每个Eq也都是PartialEq,但反之则不成立。具体而言,PartialEq只要求操作是部分等价关系,而Eq则做出更强的承诺,即该关系是一个等价关系
一个很好的例子是f32f64这样的浮点类型,它们都具有特殊的NaN值,该值与自身不相等,因此它们是PartialEq但不是Eq类型。在哈希映射和二叉树等数据结构中,拥有一个与自身不相等的值是灾难性的,因此这些数据结构需要一个Eq类型,而f32只是PartialEq类型。试着创建一个HashSet<f32>,你会很快遇到一些编译器错误。
然而,在您的情况下,您实际上不需要担心这些。由于您的类型是一个简单的枚举,因此您可以简单地派生出bothPartialEqEq
#[derive(Debug, PartialEq, Eq)]
pub enum MyEnum { ... }

那么 == 将正好按照您所希望的方式工作。


1
我以为我试过了,可能我没有推导出两个,谢谢! - Spencer H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接