首页 > 解决方案 > 如何比较 Rust 中的枚举实例

问题描述

嘿,我正在学习 rust 并试图弄清楚为什么我不能直接比较一个非常简单的 Enum 的两个实例,我尝试过使用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

这不是预期的效果。

如果我只是使用数字或字符串,这会很好,但我觉得 Enum 的用处应该是没有关联的值,那么为什么这很难做到呢?

标签: rustenumsequality

解决方案


Rust 相等有两种形式,PartialEqEq. everyEq也是PartialEq,但反之则不成立。具体来说,PartialEq只要求运算是部分等价关系,而Eq更强地保证关系是等价关系

类型的一个很好的例子是浮点类型和,它们都有一个PartialEq不等于自身的特殊 NaN 值。在 hashmap 和二叉树等数据结构中,具有不等于自身的值是灾难性的,因此像这样的数据结构需要 is ,而is only的类型。去尝试制作一个. 你会很快遇到一些编译器错误。Eqf32f64Eqf32PartialEqHashSet<f32>

但是,就您而言,您实际上并不需要担心任何这些。由于您的类型是一个简单的枚举,您可以简单地派生PartialEqEq

#[derive(Debug, PartialEq, Eq)]
pub enum MyEnum { ... }

然后==将完全按照您的意愿工作。


推荐阅读