我有一个返回类似
Result<Option<Value>, Error>
之类的函数,我想检查是否有一个值以及它是否与条件匹配。有两种简单的方法:
if let Ok(Some(value)) = func() {
if /* condition */ {
/* do something */
}
}
和
if func().is_ok_and(|option| option.is_some_and(|value| /* condition */ )) {
/* do something */
}
第一个对我来说似乎更具可读性,但在某些情况下,我可以想象出现很多嵌套。第二种可读性较差,并且引入了极长的行,但可以防止过度嵌套。其中一个比另一个更可取吗?或者还有其他我不知道的更简单的方法吗?
类似于这个github问题中讨论的内容将会非常有帮助,通过这样做:
if let Ok(Some(value)) = func() && /* condition */ {
/* do something */
}
防止过度嵌套并保持可读性,但我发现目前 Rust 中没有类似的功能。
在不滥用
Result
和 Option
上的方法的情况下,一种非常干净的方法就是 match
:
match value {
Ok(Some(x)) if /* condition */ => { /* do something */ },
_ => {}
}