如何将枚举值传递给函数?

时间:2020-10-12 15:49:57

标签: enums rust arguments

我有几个枚举:

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。

2 个答案:

答案 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
    }
}