如何在忽略关联值的情况下比较Rust中的枚举值?
问题解答
默认通过#[derive(PartialEq)]生成的PartialEq实现会同时比较枚举变体和关联值,所以你当前的代码会打印"not equal",不符合需求。
如果不想手动实现PartialEq trait,有两种简洁的解决办法:
方法一:使用std::mem::discriminant
这个标准库函数会返回枚举变体的唯一标识符,完全忽略关联值。修改比较逻辑即可实现需求:
fn main() { let first = test::a(0); let second = test::a(1); if std::mem::discriminant(&first) == std::mem::discriminant(&second) { println!("equal"); } else { println!("not equal") } } #[derive(Debug)] // 可选,仅用于调试场景 enum test { a(usize), }
这段代码会打印"equal",因为discriminant只判断枚举属于哪个变体,不检查关联值的内容。
方法二:定义无关联值的辅助枚举
额外定义一个仅包含变体信息的枚举,为原始枚举实现转换方法,再基于辅助枚举做比较,可读性更强:
fn main() { let first = test::a(0); let second = test::a(1); if first.variant() == second.variant() { println!("equal"); } else { println!("not equal") } } enum test { a(usize), } #[derive(PartialEq)] enum TestVariant { A, } impl test { fn variant(&self) -> TestVariant { match self { test::a(_) => TestVariant::A, } } }
如果希望直接用==运算符比较原始枚举,那还是需要手动实现PartialEq:
fn main() { let first = test::a(0); let second = test::a(1); if first == second { println!("equal"); } else { println!("not equal") } } enum test { a(usize), } impl PartialEq for test { fn eq(&self, other: &Self) -> bool { match (self, other) { (test::a(_), test::a(_)) => true, // 后续新增变体时补充对应比较逻辑 } } }
总结:如果不想手动实现PartialEq,std::mem::discriminant是最直接的方案;如果追求代码可读性,辅助枚举是更友好的选择。
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

