rust - 如何比较 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 的用处应该是没有关联的值,那么为什么这很难做到呢?
解决方案
Rust 相等有两种形式,PartialEq
和Eq
. everyEq
也是PartialEq
,但反之则不成立。具体来说,PartialEq
只要求运算是部分等价关系,而Eq
更强地保证关系是等价关系。
类型的一个很好的例子是浮点类型和,它们都有一个PartialEq
不等于自身的特殊 NaN 值。在 hashmap 和二叉树等数据结构中,具有不等于自身的值是灾难性的,因此像这样的数据结构需要 is ,而is only的类型。去尝试制作一个. 你会很快遇到一些编译器错误。Eq
f32
f64
Eq
f32
PartialEq
HashSet<f32>
但是,就您而言,您实际上并不需要担心任何这些。由于您的类型是一个简单的枚举,您可以简单地派生和 。PartialEq
Eq
#[derive(Debug, PartialEq, Eq)]
pub enum MyEnum { ... }
然后==
将完全按照您的意愿工作。
推荐阅读
- primeng - PrimeNG 10.0.3 - 错误 NG8001:“p-tabView”不是已知元素
- r-raster - R中的“stackApply”函数存在问题
- python - 安装robotframework-ride时出错
- angular - 使用角度接口创建对象数组
- sql - 用外键引用主键的问题
- c++ - C ++中的静态或内联有什么区别
- powershell - 如何在powershell的后台连续ping?
- python - 当模型已经存在时,为什么我会收到模型未找到错误?
- django - 创建带条件的字段
- cognos - 在本地驱动器上将 Cognos 报告另存为 .xlsx