Rust 怎么经典地比较两个枚举值是否相同?

发布于 2022-08-28 11:26:31 字数 683 浏览 80 评论 0

对于普通的枚举类型(举例),

enum ErrorCode {
    EINVAL = 1,
    EAGAIN = 2,
}

let e1 = EINVAL;
let e2 = EAGAIN;

这样的判断是非法的:

assert_eq!(e1, e2);

如果不实现 trait Eq 的话,

impl Eq for ErrorCode {
    fn eq(&self, other :&ErrorCode) -> bool {
        *self as int == *other as int
    }
}

也除了 e1 as int == e2 as int 的话,是否有别的典型的办法可以比较 e1e2 是否为同一值?

总觉得这两个办法都有点别扭。另外,即使实现了 Eq,貌似 assert_eq!(e1, e2) 也会报错,只能用 assert!(e1 == e2) 这样的写法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情独悲 2022-09-04 11:26:31
#[deriving(Eq)]
#[deriving(Show)]
enum ErrorCode {
    EINVAL = 1,
    EAGAIN = 2,
}

assert_eq!(e1, e2);

rustc版本:rustc 0.10-pre (33768c4 2014-03-07 02:51:39 -0800)

失退 2022-09-04 11:26:31

不用 eq 的话只能模式匹配了:

enum Foobar {
    Foo,
    Bar,
}

fn main() {
    let a = Foobar::Foo;
    let b = Foobar::Bar;

    match (a, b) {
        (Foobar::Foo, Foobar::Foo) | (Foobar::Bar, Foobar::Bar) => println!("一样"),
        (Foobar::Foo, Foobar::Bar) | (Foobar::Bar, Foobar::Foo) => println!("不一样"),
    }
}

很繁琐,但是可以写宏。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文