0

我正在学习 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]:闭包需要唯一访问selfself.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() { | ---- 由于使用selfin 闭包而发生借用 ... 139 | } | - 借用在这里结束

4

0 回答 0