Rust中如何比较枚举(Enum)实例?matches!与派生Eq不生效问题处理
问题原因分析
matches!宏使用错误matches!的第二个参数是模式而非普通表达式,你写的matches!(myenum, en)中,en会被识别为新的变量绑定,会匹配任意输入值,所以永远返回true,这就是你运行输出全为true的核心原因。- 相等比较的trait依赖问题
Rust不会为类型默认实现相等比较逻辑,你单独派生Eq无法生效,因为Eq继承自PartialEq,必须同时实现PartialEq才能使用==运算符。
修复方案
第一步:为两个枚举同时派生PartialEq和Eq trait
#[derive(Debug, PartialEq, Eq)] pub enum MyEnum { Enum1, Enum2, Enum3 } #[derive(Debug, PartialEq, Eq)] pub enum ThingEnum { NoOp, Enum(MyEnum) }
第二步:直接使用==做比较即可
println!("{:?} == {:?} -> {}", myenum, en, myenum == en);
如果确实需要用matches!做固定变体判断,需要明确写枚举变体名,比如matches!(myenum, MyEnum::Enum1),但动态比较两个枚举变量的场景下,直接用==更合理。
补充说明
Rust要求显式派生相等逻辑,是因为不是所有类型都存在通用的相等语义(比如包含指针、特殊引用的类型,默认比较行为会有歧义)。对于无关联值、或者关联值已实现PartialEq的枚举,只需要添加派生属性就可以直接比较,不需要手动写实现逻辑。
内容的提问来源于stack exchange,提问作者Spencer H
相关产品推荐
相关产品推荐

