是否有 shorthand 用于评估可反驳模式是否匹配?

Is there a shorthand for evaluating whether a refutable pattern matches?

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

let val = get_optional_value();
if val => Some(inner) {
    do_something(inner);
}

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

get_optional_value()
    .filter(|iv| iv => InnerVariant::VariantA)
    .and_then(/* ... */)

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

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

有一个 similar question 没有得到回答,但评论确实指出使用 ? 运算符解决了 std::result::Result.[=22 的相关极端情况=]

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

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

get_optional_value()
    .filter(|iv| matches!(iv, InnerVariant::VariantA))
    .and_then(/* ... */)

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