Rust 我可以使用itertools::PutBack::将您放回循环中吗?

Rust 我可以使用itertools::PutBack::将您放回循环中吗?,rust,itertools,borrow-checker,Rust,Itertools,Borrow Checker,我的用例: 环绕字符串 对词法分析器状态机中的每个字符作出反应 看到一些字符后,意识到前一个字符是其标记的结尾 完成代币 转换回空状态(表示没有部分构造令牌) 使用put\u back 继续状态机处理,其中返回字符将可用于下一个令牌中的第一个字符 以下是一个尝试的示例: use itertools::put_back; // 0.8.0 fn main() { let hello = "Hello world".to_owned(); let hello_iter = he

我的用例:

  • 环绕字符串
  • 对词法分析器状态机中的每个字符作出反应
  • 看到一些字符后,意识到前一个字符是其标记的结尾
  • 完成代币
  • 转换回状态(表示没有部分构造令牌)
  • 使用
    put\u back
  • 继续状态机处理,其中返回字符将可用于下一个令牌中的第一个字符
以下是一个尝试的示例:

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());
    }
}
错误消息:

错误[E0382]:移动值的借用:`putback\u迭代器`
-->src/main.rs:10:13
|
6 |让mut putback_迭代器=put_back(hello_iter);

|---------之所以发生移动,是因为'putback\u iterator'的类型为'itertools::adapters::putback
for
循环允许您迭代实现的任何内容。此特性将
定义为\u iter(self)
,它使用调用它的对象并返回迭代器。即使
self
已经是一个迭代器(就像在代码中一样),这也是正确的

因此,for
循环使用迭代器,使得迭代器在循环中不可访问

另一种方法是在让循环时使用

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());
    }
}

@Shepmaster-感谢您的编辑!杰出的我是一名C#程序员,我总是在foreach循环中使用IEnumerables,从来没有在while循环中使用过,所以我没有想到这一点。