我可以在循环中使用 itertools::PutBack::put_back 吗?

Can I use itertools::PutBack::put_back in a loop?

我的用例:

这是一个尝试的例子:

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;
    for c in putback_iterator {
        if c == 'd' && !already_putback {
            putback_iterator.put_back('!');
            already_putback = true;
        }
        println!("Char is {}", c.to_string());
    }
}

错误信息:

error[E0382]: borrow of moved value: `putback_iterator`
  --> src/main.rs:10:13
   |
6  |     let mut putback_iterator = put_back(hello_iter);
   |         -------------------- move occurs because `putback_iterator` has type `itertools::adaptors::PutBack<std::str::Chars<'_>>`, which does not implement the `Copy` trait
7  |     let mut already_putback = false;
8  |     for c in putback_iterator {
   |              ---------------- value moved here
9  |         if c == 'd' && !already_putback {
10 |             putback_iterator.put_back('!');
   |             ^^^^^^^^^^^^^^^^ value borrowed here after move

我将如何遍历字符并执行 put_back?我找不到任何使用 put_back.

的有效示例

for 循环允许您迭代任何实现 IntoIterator 的东西。这个特征定义了 into_iter(self) 消耗它被调用的对象和 returns 一个迭代器。即使 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