Rust 引用的生命周期应该长于函数

Rust Lifetime of reference should outlive function

我有一个小虚拟解析器,它在解析过程中使用相同的 &str:

struct Parser<'a>{
    r: &'a str,
    pos: usize
}

impl<'a, 'b: 'a> Parser<'a>{
    fn new(s: &'b str)->Parser<'a>{
        Parser{r: s, pos:0}
    }
    fn next(&'a self)->Parser<'a>{
        Parser{r: self.r, pos: self.pos + 1}
    }
    fn nnext(&'a self)->Parser<'a>{
        Parser{r: self.r, pos: self.pos + 2}
    }
    fn nnnext(&'a self)->Parser<'a>{
        return self.next().nnext()
    }
}

我会这样使用它:

fn parse(s: &str){
    let parser = Parser::new(s);
    parser.nnnext();
}

我收到以下错误:

25 |         return self.next().nnext()
   |                -----------^^^^^^^^
   |                |
   |                returns a value referencing data owned by the current function
   |                temporary value created here

引用保证比所有解析器方法都长。必须如何注释生命周期来表达这一点?特别是,为什么 nnnext 不编译?应该清楚的是,引用比 self.next().nnext() 调用还长。

非常感谢您的帮助。 亨德里克

通过使用 &'a self,您将解析器的生命周期与其引用的字符串的生命周期混为一谈。没有理由。

如果删除此约束,就没有问题了:

struct Parser<'a>{
    r: &'a str,
    pos: usize
}

impl<'a> Parser<'a>{
    fn new(s: &'a str)->Parser<'a>{
        Parser{r: s, pos:0}
    }
    fn next(&self)->Parser<'a>{
        Parser{r: self.r, pos: self.pos + 1}
    }
    fn nnext(&self)->Parser<'a>{
        Parser{r: self.r, pos: self.pos + 2}
    }
    fn nnnext(&self)->Parser<'a>{
        return self.next().nnext()
    }
}

(没用的我也去掉了'b)