Краткий ответ: flat_map
.
Другая сложная часть заключается в том, что итератор должен отслеживать свой текущий элемент. Идиоматический c способ заставить ваш пример работать, вероятно, состоит в том, чтобы ввести iter
метод, возвращающий фактические Iterator
.
struct ProduceOnes(Vec<usize>);
impl ProduceOnes{
fn iter<'s>(&'s self) -> impl Iterator<Item=usize> + 's {
self.0.iter().flat_map(|&value| 0..value).map(|_| 1)
}
}
Полученный итератор будет отслеживать текущий элемент без изменения состояние ProduceOnes
. Можем ли мы заставить ваш пример работать, не вводя этот дополнительный метод и не реализуя черту Iterator
напрямую? Ответ - да, но нам нужно изменить ProduceOnes
, чтобы сделать это. Вот пример итерации по элементам в Ve c.
impl Iterator for ProduceOnes {
type Item=usize;
fn next(&mut self) -> Option<usize> {
match self.0.last_mut() {
Some(&mut 0) => {
self.0.pop();
self.next()
},
Some(value) => {
*value -= 1;
Some(1)
}
None => None
}
}
}
.