为什么我会收到错误"不能多次借x可变"?

Aks*_*iri 1 lifetime rust

我在Rust中实现了一个解析器.我必须更新前瞻的索引,但是当我收到错误self.get()后调用时self.current():

cannot borrow *self as mutable more than once at a time
Run Code Online (Sandbox Code Playgroud)

这是令人困惑的,因为我是Rust的新手.

#[derive(Debug)]
pub enum Token {
    Random(String),
    Undefined(String),
}

struct Point {
    token: Vec<Token>,
    look: usize,
}

impl Point {
    pub fn init(&mut self){
        while let Some(token) = self.current(){
            println!("{:?}", token); 
            let _ = self.get();
        }
    }

    pub fn current(&mut self) -> Option<&Token> {
        self.token.get(self.look)
    }

    pub fn get(&mut self) -> Option<&Token> {
        let v = self.token.get(self.look);
        self.look += 1;
        v
    }

}

fn main(){
    let token_list = vec![Token::Undefined("test".to_string()),
                     Token::Random("test".to_string())];

    let mut o = Point{ token: token_list, look: 0 };
    o.init();
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ian 5

该函数Point::get改变了Point它被调用的函数.该函数Point::current返回Point对其被调用的部分的引用.所以,当你写作

while let Some(token) = self.current() {
    println!("{:?}", token); 
    let _ = self.get();
}
Run Code Online (Sandbox Code Playgroud)

token是对存储的内容的引用self.因为变异self可能会改变或删除任何token指向的点,编译器会阻止您self.get()在变量token在范围内时调用.