作为一名来自其他函数式编程语言,并且是Rust新手的人,我对Rust的if let
语法的动机有些惊讶。这个RFC提到,如果没有if let
,那么"测试和解包一个Option<T>
的惯用解决方案"是:
match opt_val {
Some(x) => {
do_something_with(x);
}
None => {}
}
或者if opt_val.is_some() {
let x = opt_val.unwrap();
do_something_with(x);
}
在Scala中,完全可以采用相同的方法,但惯用解决方案是对Option
进行map
操作(如果只是为了执行doing_something_with(x)
的副作用,也可以使用foreach
)。
为什么在Rust中不能采用相同的惯用解决方案呢?
opt_val.map(|x| do_something_with(x));
if let Some(foo) = bar { ... } else if let Some(foo) = baz { ... } else if let Some(foo) = daz { ... } else { ... }
?使用map/flatMap似乎会很嵌套:bar.map(...).orElse(baz.map(...).orElse(daz.map(...))).getOrElse(...)
。 - fantomList(bar, baz, daz).find(_.isDefined).foreach(println(_))
- bluenote10println
),该怎么办?我最近遇到了这个问题,没有找到比嵌套映射/orElse更好的方法。 - fantom