如何在 Rust 中比较 Enum 实例

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)

然后==将完全按照您想要的方式工作。