【发布时间】:2015-02-16 12:27:44
【问题描述】:
来自其他函数式语言(并且是 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 中,可以做完全相同的事情,但惯用的解决方案是 map 而不是 Option(或 foreach,如果它只是为了 doing_something_with(x) 的副作用) .
为什么在 Rust 中做同样的事情不是一个惯用的解决方案?
opt_val.map(|x| do_something_with(x));
【问题讨论】:
-
你如何在 Scala 中做这样的事情:
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(...) -
@fantom:例如:
List(bar, baz, daz).find(_.isDefined).foreach(println(_)) -
是的,如果您需要在每个分支中执行相同的操作,但如果它们不同(而不是每个分支的
println)怎么办?我最近遇到了这个问题,没有发现比嵌套 map/orElse 更好的方法