gpt4 book ai didi

rust - 无法一次多次借用可变的迭代器

转载 作者:行者123 更新时间:2023-11-29 08:20:28 27 4
gpt4 key购买 nike

我正在用 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(),
};
}
}
}

我得到的错误是:

error[E0499]: cannot borrow `self.it` as mutable more than once at a time
--> src/main.rs:13:29
|
11 | match self.it.peek() {
| ------- first mutable borrow occurs here
12 | None => break,
13 | Some(_x) => self.it.next(),
| ^^^^^^^ second mutable borrow occurs here
14 | };
| - first borrow ends here

我已经能够通过创建迭代器的副本并在其上调用 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(),并且 charCopy,您可以取消引用以获取 >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_some():

let r = self.it.peek().is_some();
if r { ... } else { ... }

但是,总的来说,我不确定在没有非词汇生命周期的情况下是否可以完全按照这种方式进行。您将需要放置检查迭代器状态的代码和基于具有范围的状态与迭代器一起工作的代码,如下所示:

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

这里对 self 的任何引用都不能逃脱 r 中的词法 block ,因此在包含引用的值上没有直接的匹配进入 self Rust borrow of a HashMap lasts beyond the scope it's in? 中有更多解决此问题的示例.

关于rust - 无法一次多次借用可变的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51577192/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com