【问题标题】:How to pass an enum value to a function? [closed]如何将枚举值传递给函数? [关闭]
【发布时间】:2020-10-12 15:49:57
【问题描述】:

我有几个枚举:

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。

【问题讨论】:

  • 这是学习 Rust 的第一天。我建议您在继续之前阅读The Rust Book,否则您将需要不断地提出这些简单的问题,这些问题对其他任何来到 Stackoverflow 的人都没有用处。
  • 抱歉,我的意思没有解释清楚。
  • 如果您包含一个 minimal reproducible example 来显示您正在尝试执行的操作以及您遇到的错误,将会很有帮助。现在的情况是,人们只需要猜测你在尝试什么。

标签: enums rust arguments


【解决方案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

【讨论】:

    【解决方案2】:

    我不确定这是否能解决您遇到的问题,但您可以使用匹配表达式:

    fn my_function(f: Foo) -> Option<Foo> {
        match f {
            Foo::B(B::E(_)) => { /* your code */ }
            _ => None // otherwise, return None
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2023-02-06
      • 2012-01-14
      • 1970-01-01
      • 2011-08-15
      • 2021-07-25
      相关资源
      最近更新 更多