Мне нужно реализовать метод iter
, который возвращает что-то, что реализует черту Iterator<Item = char>
. Но возвращаемое значение будет отличаться от реализации, в зависимости от варианта перечисления.Как реализовать метод iter с помощью статической/динамической отправки?
Что-то вроде этого:
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()
возвращает структуру, которая реализует Iterator<Item=char>
.
merge
и interleave
являются itertools
методы, которые возвращают MergeAscend
и Interleave
соответственно (оба реализации Iterator<Item=char>
)
- Как реализовать такую схему статической отправки?
- Если статическая отправка невозможна, как реализовать такую схему с помощью динамической отправки?