是否有用于评估可反驳模式是否匹配的简写?

all*_*y87 4 pattern-matching rust

据我所知,辩驳的模式只能在测试matchif letwhile let表达。为了说明我想做什么,请考虑=>在以下上下文中使用match 语句中的语法:

let val = get_optional_value();
if val => Some(inner) {
    do_something(inner);
}
Run Code Online (Sandbox Code Playgroud)

我可以使用if let语句,但更有用的上下文是简短的闭包:

get_optional_value()
    .filter(|iv| iv => InnerVariant::VariantA)
    .and_then(/* ... */)
Run Code Online (Sandbox Code Playgroud)

据我所知,使用模式匹配实现这一目标的唯一解决方案是:

get_optional_value()
    .filter(|iv| {
        if let InnerVariant::VariantA = iv {
            true
        } else {
            false
        }
    })
    .and_then(/* ... */)
Run Code Online (Sandbox Code Playgroud)

有一个类似的问题没有得到回答,但评论确实指出使用?运算符解决了 的相关极端情况std::result::Result

jus*_*nas 9

Rust 1.42 添加了matches!宏。matches!(X, Y)返回一个布尔值,指示表达式是否X与模式匹配Y

在你的情况下,它可以这样使用:

get_optional_value()
    .filter(|iv| matches!(iv, InnerVariant::VariantA))
    .and_then(/* ... */)
Run Code Online (Sandbox Code Playgroud)

这不允许您绑定新名称,您只能访问可选if保护中的“内部”数据。