如何解决如何将枚举值传递给函数?
我有几个枚举:
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。
解决方法
您无法使用函数执行此操作,因为函数参数必须是完整值,并且表示“枚举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),}
}}
}
然后您这样呼叫:
filter_foo!(x,Foo::B (B::E (_)))
有关宏的更多详细信息,请参见The Little Book of Rust Macros。
,我不确定这是否可以解决您遇到的问题,但是您可以使用匹配表达式:
fn my_function(f: Foo) -> Option<Foo> {
match f {
Foo::B(B::E(_)) => { /* your code */ }
_ => None // otherwise,return None
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。