This code compiles fine:
use std::iter::Peekable;
struct Token {
length: u32,
}
fn get_tokens() -> Box<dyn Iterator<Item = Token>> {
todo!()
}
fn do_something_with_boxed_filter(boxed: Box<dyn Iterator<Item = Token>>) {}
fn main() {
let tokens = get_tokens();
let long_tokens = tokens.filter(|token| token.length > 32);
let boxed = Box::new(long_tokens);
do_something_with_boxed_filter(boxed);
}
But if I try to make a peekable version, as shown below, it fails to compile.
use std::iter::Peekable;
struct Token {
length: u32,
}
fn get_tokens() -> Box<dyn Iterator<Item = Token>> {
todo!()
}
fn do_something_with_peekable(peekable: Peekable<Box<dyn Iterator<Item = Token>>>) {}
fn main() {
let tokens = get_tokens();
let long_tokens = tokens.filter(|token| token.length > 32);
let boxed = Box::new(long_tokens);
let peekable = boxed.peekable();
do_something_with_peekable(peekable);
}
The error message is:
error[E0308]: mismatched types
--> src/main.rs:18:32
|
15 | let long_tokens = tokens.filter(|token| token.length > 32);
| ------------------------- the found closure
...
18 | do_something_with_peekable(peekable);
| ^^^^^^^^ expected trait object `dyn Iterator`, found struct `Filter`
|
= note: expected struct `Peekable<Box<(dyn Iterator<Item = Token> + 'static)>>`
found struct `Peekable<Box<Filter<Box<dyn Iterator<Item = Token>>, [closure@src/main.rs:15:37: 15:62]>>>`
For more information about this error, try `rustc --explain E0308`.
I don't understand this; the Filter struct implements Iterator so shouldn't I be able to use a Filter struct in place of the dyn Iterator trait object?