为什么我会收到错误"cannot borrow x as mutable more than once"?



我正在Rust中实现一个解析器。我必须更新索引的前瞻性,但当我调用self.get()self.current()我得到一个错误:

cannot borrow *self as mutable more than once at a time

因为我是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();
}

函数Point::get使调用它的Point发生变异。函数Point::current返回对调用它的Point的一部分的引用。所以,当你写

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

token是对存储在self中的内容的引用。因为改变self可能会改变或删除token所指向的内容,所以当变量token在作用域中时,编译器会阻止调用self.get()

@Adrian已经给出了编译器给出错误消息的正确原因。如果将变化的表达式绑定到作用域中,然后在作用域完成后调用self.get,则可以编译程序。
代码可以修改为

loop{
    {
        let t = if let Some(token) = self.current(){
                    token
                }else{
                    break
                };
        println!("{:?}", t); 
    }
    let b = self.get();
    println!("{:?}", b);
}

相关内容

最新更新