I need to implement the method iter
, which returns something which implements the trait Iterator<Item = char>
. But the return value will be different implementations, depending on the enum variant.
Something like this:
pub enum Class {
SingleChar(char),
Range(Range),
And(Vec<Class>),
Or(Vec<Class>),
}
impl Class {
pub fn iter(&self) -> Iterator<Item = char> {
match *self {
Class::SingleChar(c) => vec![c],
Class::Range(ref range) => range.iter(),
Class::And(ref classes) => {
let iter: Option<_> = classes.iter().fold(None, |iter, &class| {
match iter {
None => Some(class.iter()),
Some(iter) => Some(iter.merge(class.iter())),
}
});
Box::new(iter.unwrap())
},
Class::Or(ref classes) => {
let iter: Option<_> = classes.iter().fold(None, |iter, &class| {
match iter {
None => Some(class.iter()),
Some(iter) => Some(iter.interleave(class.iter())),
}
});
Box::new(iter.unwrap())
},
}
}
}
range.iter()
returns a struct that implements Iterator<Item=char>
.
merge
and interleave
are itertools
methods, which return MergeAscend
and Interleave
respectively (both of them implement Iterator<Item=char>
)
- How to implement such a scheme using static dispatch?
- If static dispatch is not possible, how to implement such a scheme using dynamic dispatch?