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

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

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) 这样的写法。

阅读 13.6k
2 个回答
#[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)

不用 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!("不一样"),
    }
}

很繁琐,但是可以写宏。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进