-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質問を読むだけでは、なぜこの問題が発生したのか答えは問題を解決する方法ではありませんでした。
ありがとうございました。単一のマッチだけに役立つコードをリファクタリングしました。 –