all*_*y87 4 pattern-matching rust
据我所知,辩驳的模式只能在测试match
,if let
和while 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
。
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
保护中的“内部”数据。