有没有办法评估一个函数作为匹配臂的输入?

use*_*409 4 function pattern-matching match rust

match input_string {
    func_that_returns_string(MyEnum::MyVariant1) => do_something(),
    func_that_returns_string(MyEnum::MyVariant2) => do_something_else(),
    _=> do_nothing(),
}
Run Code Online (Sandbox Code Playgroud)

以下是错误消息的示例:错误:预期的元组结构或元组变体,找到的函数func_that_returns_string

Ale*_*nov 7

好吧,你可以使用比赛守卫来做到这一点,看起来像x if condition =>

fn fun(variant: MyEnum) -> String {
    match variant {
        MyEnum::Variant1 => "String1".to_string(),
        MyEnum::Variant2 => "String2".to_string(),
    }
}

pub fn main() {
    let s = "String2".to_string();
    match s {
        s if s == fun(MyEnum::Variant1) => do_something(1),
        s if s == fun(MyEnum::Variant2) => do_something(2),
        _ => {},
    }

    // prints 2
}
Run Code Online (Sandbox Code Playgroud)

但无论哪种方式,它看起来都很笨拙,我建议你修改你的设计。

  • 每个匹配臂中箭头之前的部分是_pattern_,而不是表达式。函数调用在模式中没有多大意义——它并不是真正可以匹配的模式。 (4认同)