我正在学习 Rust 并正在尝试编写一个简单的词法分析器。我next_token
在一个impl
块中有一个函数,它从输入字符迭代器中读取下一个标记。但是,由于多次借用 self ,代码将无法构建。我该如何解决这个问题?
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]:无法移出借用的内容--> lexer.rs:110:20 | 110 | let literal = self.input.take_while(|&ch| { | ^^^^ 不能移出借来的内容
错误[E0500]:闭包需要唯一访问
self
但self.input
已被借用--> lexer.rs:110:42 | 108 | 匹配 self.input.by_ref().peek() { | ---------- 借用发生在这里 109 | Some(c) if c.is_alphabetic() || *c == '_' => { // 标识符或关键字 110 | let literal = self.input.take_while(|&ch| { | ^^^^^ 闭包构造发生在这里 111 |
match self.input.peek() { | ---- 由于使用self
in 闭包而发生借用 ... 139 | } | - 借用在这里结束