多次自借

时间:2016-10-31 22:09:23

标签: rust borrowing

我正在学习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 | }       | - 借这里结束

0 个答案:

没有答案