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():
#![allow(unused)]
fn main() {
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():
#![allow(unused)]
fn main() {
let turing = Some("Turing");
let logicians = vec!["Curry", "Kleene", "Markov"];
for logician in logicians.iter().chain(turing.iter()) {
println!("{logician} is a 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::onceis an iterator which yields exactly one element. It’s a more readable alternative toSome(foo).into_iter(). -
Iterator::filter_mapis a version ofIterator::map, specialized to mapping functions which returnOption. -
The
ref_slicecrate provides functions for converting anOptionto a zero- or one-element slice.