我已经遇到过几起类似的情况:
if let Some(x) = formula_chars.peek() {
if x.is_lowercase() {
todo!()
}
}
我希望表达式的计算结果为 false,如果某个Option
isNone
或对Some
变体的某些操作(在本例中is_lowercase()
)返回 false。但是,我发现这样做的唯一方法是使用if
如上所示的嵌套语句。有没有办法用单个表达式做到这一点?最好是类似以下代码的内容:
注意:下面的代码不起作用,它只是为了说明所需的行为
if formula_chars.peek().unwrap_or(false).is_lowercase() {
todo!()
}
PS 在这种特定情况下我知道我可以unwrap_or
使用非小写字符例如
if formula_chars.peek().unwrap_or('_').is_lowercase() {
todo!()
}
但我正在寻找一个更通用(最好是更少麻烦的)解决方案
您可以使用
Option::is_some_and
:我发现,与定义立即委托给另一个函数的 lambda 相比,将委托函数作为路径表达式传递更符合工程学:
但是,lambda 中使用的方法调用表达式
x
会在接收方上执行自动解引用(如果需要),但如果函数作为路径表达式传递,则不会发生这种情况。因此,由于在这种情况下char::is_lowercase
采用char
not&char
,如果您有,Option<&char>
您可以先调用Option::copied
:这只是个人品味而已。YMMV。
其他一些选择:
map_or()
:map()
那么unwrap_or()
,有些人更喜欢这样map_or()
:match
:match
:您可能更喜欢
is_some_and()
,它是最干净、最具体的组合器,但它们在其他场景中也可能有用。