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

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


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

很繁琐,但是可以写宏。

【热门文章】
【热门文章】