Rust 无法一次多次借用迭代器作为可变迭代器

Rust 无法一次多次借用迭代器作为可变迭代器,rust,Rust,我正在用Rust编写一个简单的标记器,但我遇到了麻烦。为了这个问题,我简化了代码: use std::iter::Peekable; use std::str::Chars; struct Example<'a> { it: Peekable<Chars<'a>>, } impl<'a> Example<'a> { fn tokenize_string(&mut self) { loop {

我正在用Rust编写一个简单的标记器,但我遇到了麻烦。为了这个问题,我简化了代码:

use std::iter::Peekable;
use std::str::Chars;

struct Example<'a> {
    it: Peekable<Chars<'a>>,
}

impl<'a> Example<'a> {
    fn tokenize_string(&mut self) {
        loop {
            match self.it.peek() {
                None => break,
                Some(_x) => self.it.next(),
            };
        }
    }
}
我已经能够通过创建迭代器的副本并调用
peek()
来解决这个问题:

fn tokenize_string(&mut self) {
    loop {
        let mut iterator = self.it.clone();
        match iterator.peek() {
            None => break,
            Some(_x) => self.it.next(),
        };
    }
}

这是最好的方法吗?这似乎有点黑客味。

因为您使用的是
str::chars()
,而
char
Copy
,所以您可以取消引用以获得
char
而不是
&char

fn tokenize_string(&mut self) {
    loop {
        let r = self.it.peek().cloned();
        let n = match r {
            Some(_) => self.it.next(),
            None => break,
        };
        // whatever
    }
}
如果您只想检查迭代器是否返回了某些内容,请使用
is\u some()

但是,总的来说,我不确定在没有非词汇生命周期的情况下,是否能够以这种方式实现。您需要将检查迭代器状态的代码和使用迭代器的代码放在具有作用域的状态的基础上,如下所示:

let r = {
    // work with self.it
};
if r { ... } else { ... }

在这里,对
self
的任何引用都不能脱离
r
中的词法块,因此对于包含对
self
的引用的值,没有直接的
匹配。在中有更多解决此问题的示例。

这是目前生锈的一个缺点:请参阅。另一种解决方法是
让m=self.it.peek();匹配m{
@mcpherinm:我认为这值得一个答案:)@mcpherinm,我不认为
让m=self.it.peek()
有效,因为问题是
peek
返回对
self的引用。它
。我没有把它作为答案,因为我不知道我是否正确。不确定这里要做什么。@dbaupp是对的,我试过了,它仍然给我相同的错误。如果你想尝试,整个文件都是可用的。你不会知道的注意,
tokenize\u string
函数有点复杂。实际上,我的代码似乎正在工作。我对复制的迭代器所做的就是调用
.peek()
。我不想在那一步推进迭代器,所以它们是否独立并不重要。不,我不想只是检查迭代器是否返回了什么,这只是函数的简化版本。你可以看到整个文件。啊,是的,对不起,不知怎的,我错过了它只是peek。无论如何,我仍然认为dupl对迭代器进行迭代不是一个好主意,当然也不是惯用方法。我想你是对的。我正在试图弄清楚惯用方法是什么。有什么想法吗?@JamesHall,我很确定我的答案符合这个条件:)
let r = {
    // work with self.it
};
if r { ... } else { ... }