Je dois mettre en œuvre la méthode iter
, qui renvoie quelque chose qui implémente le trait Iterator<Item = char>
. Mais la valeur de retour sera différente implémentations, en fonction de la variante enum.Comment implémenter la méthode iter en utilisant la répartition statique/dynamique?
Quelque chose comme ceci:
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()
renvoie une struct qui implémente Iterator<Item=char>
.
merge
et interleave
sont des méthodes itertools
, qui reviennent MergeAscend
et Interleave
respectivement (les deux mettre en œuvre Iterator<Item=char>
)
- Comment mettre en œuvre un tel système de dispatch statique?
- Si la répartition statique n'est pas possible, comment implémenter un tel schéma en utilisant la répartition dynamique?