2017-05-28 16 views
-1

借用チェッカーの問題を回避するためにこのパーサーコードをリファクタリングするにはどうすればよいでしょうか?借用チェッカーの問題を回避するパーサーコードをリファクタリングする

pub type Token=u8; 
pub trait Stream { 
    type Item; 
    fn next(&mut self) -> Option<&Self::Item>; 
    fn peek(&mut self) -> Option<&Self::Item>; 
} 

#[derive(Clone)] 
pub struct Parser { 
    input: Vec<Token>, 
    position: usize, 
} 

pub type ParseError = String; 
pub type ParseResult<T> = Result<T, ParseError>; 

impl Stream for Parser { 
    type Item = Token; 

    fn next(&mut self) -> Option<&Token> { 
     let token = self.input.get(self.position); 
     self.position += 1; 
     token 
    } 

    fn peek(&mut self) -> Option<&Token> { 
     self.input.get(self.position + 1) 
    } 
} 

fn parse_expr(stream: &mut Parser) -> ParseResult<()> { 
    match stream.peek() { // ~~ borrowed stream here 
     None => Err(String::from("No more tokens")), 
     Some(t) => match t { 
      &0 => parse_number_literal(stream), // ~~ and here 
      &1 => panic!("parse string"), 
      &2 => panic!("parse character"), 
      _ => Err(String::from("Unexpected Token")), 
     } 
    } 
} 

fn parse_number_literal(stream: &mut Parser) -> ParseResult<()> { 
    let token = stream.next(); 
    Ok(()) 
} 

fn main(){} 

コンパイラの苦情についてcannot borrow *ストリームas mutable more than once at a time。他のstackoverflow質問を読むだけでは、なぜこの問題が発生したのか答えは問題を解決する方法ではありませんでした。

答えて

1

peekの機能には&mut selfが必要ではなく、&selfを使用すると完全にエラーが解決され、cannot borrow *stream as mutable because it is also borrowed as immutableとなります。とにかく、必要がない場合はmutを避ける方が良いです。

Tokenの参照をtにバインドすると、借用が終了しないという問題があります。あなたは、マルチレベルmatchを用意する必要はありません、と

fn parse_expr(stream: &mut Parser) -> ParseResult<()> { 
    match stream.peek() { 
     None => Err(String::from("No more tokens")), 
     Some(&0) => parse_number_literal(stream), 
     Some(&1) => panic!("parse string"), 
     Some(&2) => panic!("parse character"), 
     _ => Err(String::from("Unexpected Token")), 
    } 
} 

それとも、

ボローの問題を作成しないだろうが、クローンを作成します
fn peek(&self) -> Option<Token> { 
    self.input.get(self.position + 1).cloned() 
} 

にのぞき見を変えることができると同じことを行うことができますデータ。

+0

ありがとうございました。単一のマッチだけに役立つコードをリファクタリングしました。 –

関連する問題