2015-10-14 61 views
1

我在Rust中實現了一個解析器。我需要更新先行指標,但是當我self.current()後打電話self.get()我得到一個錯誤:爲什麼我得到錯誤「不能借用x作爲多次可變」?

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

這是令人困惑,因爲我是新來的生鏽。

#[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(); 
} 

回答

5

功能Point::get變異的Point這種叫法上。函數Point::current返回對其被調用的部分Point的引用。所以,當你寫

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

token是存儲在self一些參考。由於變異self可能會更改或刪除指向的任何token,編譯器會阻止您調用self.get(),而變量token位於範圍內。

+0

究竟會做這樣的事情在生鏽的正確方法? – GOD

+1

@GOD重構您的代碼,以便您不會引用正在發生變化的事物 – Adrian

2

@Adrian已經給出了編譯器給出錯誤信息的正確原因。如果您在範圍內綁定了變異表達式,然後在範圍完成後調用self.get,則可以編譯該程序。
該代碼可以修改

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