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

Is there a way to evaluate a function as the input to a match arm?

提问人:ewoolsey 提问时间:1/11/2022 最后编辑:John Kugelmanewoolsey 更新时间:1/11/2022 访问量:1080

问:

match input_string {
    func_that_returns_string(MyEnum::MyVariant1) => do_something(),
    func_that_returns_string(MyEnum::MyVariant2) => do_something_else(),
    _=> do_nothing(),
}

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

函数 rust 模式 匹配

评论

2赞 Adam Comer 1/11/2022
你想达到什么目的?预期的行为尚不清楚。
0赞 Sven Marnach 1/11/2022
如果要匹配的字符串对应于枚举变体,则可能需要实现 .然后,您可以与 or 等臂一起使用。FromStr for MyEnummatch input_string.parse::<MyEnum>()Ok(MyEnum::MyVariant1)Err(_)
1赞 BallpointBen 1/11/2022
matchARMS 必须是模式,这些模式或多或少是文字值,您可以通过模式匹配从中提取数据。An 会更适合您正在做的事情,尽管您实际上尝试做的是将字符串映射到变体?在这种情况下,您可能想要 的倒数。if-elseMyEnumfunc_that_returns_string

答:

6赞 Alexey S. Larionov 1/11/2022 #1

好吧,您可以使用火柴后卫来做到这一点,它看起来像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
}

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

评论

0赞 ewoolsey 1/11/2022
是的,它很笨拙......太糟糕了。我上面的代码不起作用似乎有点违反直觉。
0赞 Alexey S. Larionov 1/11/2022
我想匹配表达式的编译开销很小,因为它们是静态的。虽然使用任意函数的结果无法优化,但匹配后卫也是如此
4赞 Sven Marnach 1/11/2022
每个火柴臂中箭头前面的部分是一个图案,而不是一个表达式。函数调用在模式中没有多大意义——它不是可以匹配的真正模式。
0赞 Stargateur 1/11/2022
如果你问我 match guard 是无用的,并且使代码难以阅读,编写时间更长
0赞 Caesar 1/11/2022
火柴后卫有其用途,但这不是其中之一。