Циклы
for
позволяют перебирать все, что реализует IntoIterator
. Эта черта определяет into_iter(self)
, которая потребляет объект, к которому она вызывается, и возвращает итератор. Это верно даже тогда, когда self
уже является итератором (как в вашем коде).
Таким образом, цикл for
использует итератор, делая его недоступным в цикле.
В качестве альтернативы можно использовать цикл while let
:
use itertools::put_back; // 0.8.0
fn main() {
let hello = "Hello world".to_owned();
let hello_iter = hello.chars();
let mut putback_iterator = put_back(hello_iter);
let mut already_putback = false;
while let Some(c) = putback_iterator.next() {
if c == 'd' && !already_putback {
putback_iterator.put_back('!');
already_putback = true;
}
println!("Char is {}", c.to_string());
}
}
Playground Link