我有几个枚举:
enum Foo {
A(A),
B(B)
}
enum A {
C(i32),
D(i32)
}
enum B {
E(i32),
F(i32)
}
我该如何编写一个使用Foo
并检查它是否为B::E
,然后返回Option<Foo>
的函数?
编辑:为清楚起见,枚举值作为参数传递。我尝试使用f(value: Foo, expected: Foo)
签名来执行此操作,但是我不确定如何调用它,因为(再次使用B::E
编译器希望提供i32。
答案 0 :(得分:1)
您无法使用函数执行此操作,因为函数参数必须是完整值,并且表示“枚举B的变量E”的方式带有模式。但是您可以使用一个宏来实现,该宏可以将模式作为参数。
首先,这是在函数中使用固定模式的方法:
fn filter_e (x: Foo) -> Option<Foo> {
match x {
Foo::B (B::E (_)) => Some (x),
_ => None,
}
}
现在,如果要将模式变成参数,则需要将此代码包装在宏中:
macro_rules! filter_foo {
($x:expr, $p:pat) => {{
let x = $x;
match x {
$p => Some (x),
_ => None,
}
}}
}
然后您这样呼叫:
filter_foo!(x, Foo::B (B::E (_)))
有关宏的更多详细信息,请参见The Little Book of Rust Macros。
答案 1 :(得分:0)
我不确定这是否可以解决您遇到的问题,但是您可以使用匹配表达式:
fn my_function(f: Foo) -> Option<Foo> {
match f {
Foo::B(B::E(_)) => { /* your code */ }
_ => None // otherwise, return None
}
}