Return an optional iterator

I would like to write something like:

pub fn lastv(&self) -> Option<impl Iterator<Item = &V>> {
        .filter_map(|(_, result)| match result {
            StepResult::VecVertexes(vertexes) => Some(vertexes),
            _ => None,

But I get the following error:

`&Vec<V>` is not an iterator
the trait `Iterator` is not implemented for `&Vec<V>`

I can't understand why this is not an iterator.
Also, since Option can be Iterator should it appear in the function signature?

Why do you not just return an Option<&Vec<V>>, or – even better – an Option<&[V]>?

The type &Vec<V> is not an iterator, but it is a collection type that you can iterate over, i.e. that you can convert into an iterator. The relevant trait is IntoIterator. (The same applies to Option.)

Something like -> Option<impl IntoIterator<Item = &V>> probably compiles, or to turn it into an iterator, you could add a call to .map(IntoIter::into_iter).


It is not an iterator because, well, it is not an iterator. It can be turned in to an iterator, but it is not an iterator. You could change your filter_map to return Some(vertexes.iter()) for example.

1 Like

Your repeated "not an iterator" implies that this is a FAQ. :slight_smile:

Perhaps we need to emphasize "container is not iterator" in Rust beginner's book.