用于检查表达式是否与 Rust 中的模式匹配的布尔表达式

Mar*_*cel 2 pattern-matching matching rust

我有一个Vec值,并且想要filter那些匹配特定模式的值。
什么是惯用的办法只有检查,如果一个表达式匹配的模式,而不必做一些与比赛?

enum Kind {
    A,
    B(char),
}

let vector: Vec<Option<Kind>> = ...;
vector.filter(|item| /* check if item matches pattern Some(Kind::B(_)) */)
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用match关键字:

vector.filter(|item| match item {
  Some(Kind::B(_)) => true,
  _ => false,
})
Run Code Online (Sandbox Code Playgroud)

if let关键字:

vector.filter(|item| {
  if let Some(Kind::B(_)) = item {
    true
  } else {
    false
  }
})
Run Code Online (Sandbox Code Playgroud)

但是在这两个示例中,代码看起来仍然很庞大,因为我需要手动提供truefalse常量。我觉得应该有一种更优雅的方式来做到这一点,类似于以下内容:

vector.filter(|item| matches(item, Some(Kind::B(_))))
Run Code Online (Sandbox Code Playgroud)

Mar*_*cel 5

有一个matches!为此命名的宏!

vector.filter(|item| matches!(item, Some(Kind::B(_))))
Run Code Online (Sandbox Code Playgroud)