当我不关心它包含什么价值时,如何在“if”语句中使用枚举?

时间:2017-12-15 01:04:07

标签: if-statement enums rust

我有一个枚举:

#[derive(PartialEq, Eq)]
enum Foo {
    A,
    B(usize),
}

我可以在涉及if等其他逻辑的baz语句中使用它:

fn bar(foo: &Foo, baz: bool) {
    if foo == &Foo::B(3) || baz {
        println!("Do stuff")
    }
}

然而,这不会编译:

fn bar(foo: &Foo, baz: bool) {
    if foo == &Foo::B(_) || baz {
        println!("Do stuff")
    }
}

如果我不关心if包含的值,我如何在B声明中使用它?

2 个答案:

答案 0 :(得分:2)

在这种情况下使用match可能更容易:

fn do_stuff() {
    println!("Do stuff")
}

fn bar(foo: &Foo, baz: bool) {
    match foo {
        &Foo::B(_) => do_stuff(),
        _ => {
            if baz {
                do_stuff();
            }
        }
    }
}

或者使用if let

fn bar(foo: &Foo, baz: bool) {
    if let &Foo::B(_) = foo {
        do_stuff();
    } else {
        if baz {
            do_stuff();
        }
    }
}

我不确定您是否可以轻松将其全部放入单一条件中,这会让您遗憾地重复do_stuff

答案 1 :(得分:1)

您可以使用std::mem::discriminant

impl Foo {
    fn is_b(&self) -> bool {
        discriminant(self) == discriminant(&Foo::B(0))
    }
}

如果你需要经常测试一下,我建议你为它实现一个方法:

{{1}}