我正在学习Rust,我正在尝试写一个简单的词法分析器。我在next_token
块中有一个函数impl
,它从输入字符迭代器中读取下一个标记。但是,由于多次借用自己,代码将无法构建。我该如何解决这个问题?
struct Lexer<'a> {
input: Peekable<Chars<'a>>
}
...
impl<'a> Lexer<'a> {
pub fn create(input: &str) -> Lexer {
Lexer { input: input.chars().peekable() }
}
fn next_token(&mut self) -> Option<Token> {
match self.input.by_ref().peek() {
Some(c) if c.is_alphabetic() || *c == '_' => { // Identifier or keyword
let literal = self.input.take_while(|&ch| {
match self.input.peek() {
Some(inner_c) => inner_c.is_alphanumeric() || *inner_c == '_',
None => false
}
}).collect::<String>();
if let Some(keyword) = check_keyword(&literal) { // Literal is a keyword
return Some(Token { literal: literal, token_type: keyword });
} else { // Literal is identifier
return Some(Token { literal: literal, token_type: TokenType::Identifier });
};
},
... // Other cases
}
}
}
我得到的错误:
错误[E0507]:无法移出借来的内容 - &gt; lexer.rs:110:20 | 110 | let literal = self.input.take_while(|&amp; ch | { | ^^^^无法移出借来的内容
错误[E0500]:关闭需要对
self
的唯一访问权限,但是self.input
已被借用 - &gt; lexer.rs:110:42 | 108 | match self.input.by_ref()。peek(){ | ----------借用发生在这里109 |一些(c)如果c.is_alphabetic()|| * c ==&#39; _&#39; =&GT; {//标识符或 关键字110 |让literal = self.input.take_while(|&amp; ch | { |这里发生^^^^^封闭施工111 |
match self.input.peek(){ | ----由于在封闭中使用self
而发生借用... 139 | } | - 借这里结束