用于检查表达式是否与 Rust 中的模式匹配的布尔表达式
Boolean expression for checking if expression matches pattern in Rust
我有 Vec
个值,想要 filter
匹配特定模式的值。
仅检查 if 表达式匹配模式的惯用方法是什么,而不必对匹配做任何事情?
enum Kind {
A,
B(char),
}
let vector: Vec<Option<Kind>> = ...;
vector.filter(|item| /* check if item matches pattern Some(Kind::B(_)) */)
我知道我可以使用 match
关键字:
vector.filter(|item| match item {
Some(Kind::B(_)) => true,
_ => false,
})
或if let
关键字:
vector.filter(|item| {
if let Some(Kind::B(_)) = item {
true
} else {
false
}
})
但是在这两个示例中,代码看起来仍然很笨重,因为我需要手动提供 true
和 false
常量。
我觉得应该有一种更优雅的方式来做到这一点,类似于以下内容:
vector.filter(|item| matches(item, Some(Kind::B(_))))
您可以使用Option::is_some
功能。
这是示例:
#[derive(Debug)]
enum Kind {
A,
B(char),
}
fn main() {
let vec_of = vec![Some(Kind::A), Some(Kind::B('x')), None, None];
// let col: Vec<Option<Kind>> = vec_of.into_iter().filter(Option::is_some).collect();
let col: Vec<Option<Kind>> = vec_of.into_iter().filter(|item| item.is_some()).collect();
println!("{:?}", col);
}
命令行与 .filter(|item| item.is_some())
相同,但更短。为了更好地理解,我也留下了更长的版本。
有一个名为 matches!
的宏!
vector.filter(|item| matches!(item, Some(Kind::B(_))))
我有 Vec
个值,想要 filter
匹配特定模式的值。
仅检查 if 表达式匹配模式的惯用方法是什么,而不必对匹配做任何事情?
enum Kind {
A,
B(char),
}
let vector: Vec<Option<Kind>> = ...;
vector.filter(|item| /* check if item matches pattern Some(Kind::B(_)) */)
我知道我可以使用 match
关键字:
vector.filter(|item| match item {
Some(Kind::B(_)) => true,
_ => false,
})
或if let
关键字:
vector.filter(|item| {
if let Some(Kind::B(_)) = item {
true
} else {
false
}
})
但是在这两个示例中,代码看起来仍然很笨重,因为我需要手动提供 true
和 false
常量。
我觉得应该有一种更优雅的方式来做到这一点,类似于以下内容:
vector.filter(|item| matches(item, Some(Kind::B(_))))
您可以使用Option::is_some
功能。
这是示例:
#[derive(Debug)]
enum Kind {
A,
B(char),
}
fn main() {
let vec_of = vec![Some(Kind::A), Some(Kind::B('x')), None, None];
// let col: Vec<Option<Kind>> = vec_of.into_iter().filter(Option::is_some).collect();
let col: Vec<Option<Kind>> = vec_of.into_iter().filter(|item| item.is_some()).collect();
println!("{:?}", col);
}
命令行与 .filter(|item| item.is_some())
相同,但更短。为了更好地理解,我也留下了更长的版本。
有一个名为 matches!
的宏!
vector.filter(|item| matches!(item, Some(Kind::B(_))))