如果Rust的Option提供类似于Option#flatten和Option#flat_map的一些附加便利方法,那就太好了。其中,flatten将把>>减少到Option,而flat_map则类似于map,但是使用返回Option的方法/闭包并将其展平。
flat_map非常简单:
但是这肯定行不通。你有什么想法吗?
此外,我该如何在
希望这样讲清楚了,对我的术语不够精确表示歉意 - 我是 Rust 的新手。
flat_map非常简单:
fn opt_flat_map< T, U, F: FnOnce(T) -> Option<U> >(opt: Option<T>, f: F) -> Option<U> {
match opt {
Some(x) => f(x),
None => None
}
}
flatten
更为复杂,我不太清楚如何定义它。它可能看起来像这样:
fn opt_flatten<T, U>(opt: Option<T>) -> Option<U> {
match opt {
Some( Some(x) ) => flatten_option( Some(x) ),
_ => opt
}
}
但是这肯定行不通。你有什么想法吗?
此外,我该如何在
Option
枚举上实现这些方法,以便我可以在Option
实例上本地使用它们?我知道我需要在impl OptionExts for Option<T>
的某个地方添加类型签名,但我不知道该怎么做...希望这样讲清楚了,对我的术语不够精确表示歉意 - 我是 Rust 的新手。
and_then
指针,这正是我想要的作为flat_map
。是否有一种方法可以允许flatten
到任意深度,例如对于Some(Some(Some(Some(3))))
,还是我们必须为每个级别实现特性? - Jacob BrownOption
进行特殊处理。 - Dylanflatmap
的时候遇到了困难,所以我提出了一个拉取请求,希望将它包含在and_then
的文档中:https://github.com/rust-lang/rust/pull/22111 - robinst