You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在忽略关联值的情况下比较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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:58:23