是否有 shorthand 用于评估可反驳模式是否匹配?
Is there a shorthand for evaluating whether a refutable pattern matches?
据我所知,可反驳模式只能在 match
、if let
和 while 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
守卫中的“内部”数据。
据我所知,可反驳模式只能在 match
、if let
和 while 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
守卫中的“内部”数据。