Rust:在嵌套匹配表达式中可变地借用 self

我是 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_lookaheadread_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 的参数生命周期。有人可以向我解释如何解决此错误吗?如果您需要有关我的代码的更多信息,请告诉我。谢谢!

a123zxxc 回答:Rust:在嵌套匹配表达式中可变地借用 self

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/460.html

大家都在问