我是 Rust 的新手,正在尝试为我的项目编写扫描仪。但是,我在借用错误时遇到了问题,我不确定如何解决。这是我的代码:
pub fn read_next(&mut self) -> Option<Result<Token>> {
match self.read_lookahead() {
Some(tok) => Some(Ok(tok)),
None => {
match self.read_char() {
Some(Ok(c)) => match c {
// TODO
_ => None
}
Some(Err(e)) => Some(Err(e)),
None => None
}
}
}
}
而且,这里是 read_lookahead
和 read_char
的签名:
fn read_lookahead(&mut self) -> Option<Token>
fn read_char(&mut self) -> Option<Result<char>>
这两个函数都需要更新 self
才能正常工作。我得到的错误如下:
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src\syntax\scan.rs:69:23
|
65 | pub fn read_next(&mut self) -> Option<Result<Token>> {
| - let's call the lifetime of this reference `'1`
66 | match self.read_lookahead() {
| ---- first mutable borrow occurs here
67 | Some(tok) => Some(Ok(tok)),
| ------------- returning this value requires that `*self` is borrowed for `'1`
68 | None => {
69 | match self.read_char() {
| ^^^^ second mutable borrow occurs here
直觉上,我不太理解这个错误。似乎 self
只是按顺序借用了:read_lookahead
在完成后不维护对 self
的引用——因此,实际上一次只保存一个可变引用.我如何将其传达给编译器?
我认为它需要一些带有生命周期参数的技巧,但我不完全确定如何指定它们以便它们工作——我试过让 &
t mut selfas parameter and having
't` 作为我所有函数的生命周期参数,但这不起作用。
作为参考,self
是一个 Scanner<'a>
,返回的 Token
也具有 'a
的参数生命周期。有人可以向我解释如何解决此错误吗?如果您需要有关我的代码的更多信息,请告诉我。谢谢!