`Iterator::filter_map` is analogous to `Iterator::map`, not `Iterator::flat_map`
2.0 KiB
Iterating over an Option
Description
Option
can be viewed as a container that contains either zero or one
element. In particular, it implements the IntoIterator
trait, and as such
can be used with generic code that needs such a type.
Examples
Since Option
implements IntoIterator
, it can be used as an argument to
.extend()
:
let turing = Some("Turing");
let mut logicians = vec!["Curry", "Kleene", "Markov"];
logicians.extend(turing);
// equivalent to
if let Some(turing_inner) = turing {
logicians.push(turing_inner);
}
If you need to tack an Option
to the end of an existing iterator, you can
pass it to .chain()
:
let turing = Some("Turing");
let logicians = vec!["Curry", "Kleene", "Markov"];
for logician in logicians.iter().chain(turing.iter()) {
println!("{} is a logician", logician);
}
Note that if the Option
is always Some
, then it is more idiomatic to use
std::iter::once
on the
element instead.
Also, since Option
implements IntoIterator
, it's possible to iterate over
it using a for
loop. This is equivalent to matching it with if let Some(..)
,
and in most cases you should prefer the latter.
See also
-
std::iter::once
is an iterator which yields exactly one element. It's a more readable alternative toSome(foo).into_iter()
. -
Iterator::filter_map
is a version ofIterator::map
, specialized to mapping functions which returnOption
. -
The
ref_slice
crate provides functions for converting anOption
to a zero- or one-element slice.