【问题标题】:How to compare Enum instances in Rust [duplicate]如何比较 Rust 中的枚举实例 [重复]
【发布时间】:2021-10-24 06:00:49
【问题描述】:

嘿,我正在学习 rust 并试图弄清楚为什么我不能直接比较一个非常简单的 Enum 的两个实例,我尝试使用 matches!(不起作用)和 #[derive(Eq)](只是转发问题发给impl

这是一个演示我的问题的 sn-p,它是输出。

#[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 的用处应该是没有关联的值,那为什么这么难做呢?

【问题讨论】:

    标签: rust enums equality


    【解决方案1】:

    Rust 平等有两种形式,PartialEqEq。每个Eq 也是PartialEq,但反过来不成立。具体来说,PartialEq 只要求操作是partial equivalence relation,而Eq 更能保证关系是equivalence relation

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

    但是,在您的情况下,您真的不需要担心任何这些。由于您的类型是一个简单的枚举,您可以简单地派生 both PartialEqEq

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

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

    【讨论】:

    • 我以为我试过了,我猜我没有同时推导出来,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 2017-02-08
    • 2017-01-09
    • 2016-08-28
    • 2011-10-16
    • 2020-09-18
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多