我有一个枚举:
#[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
声明中使用它?
答案 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}}