Rust引用生命周期需长于函数的Parser编译错误如何解决?
Rust 解析器生命周期标注问题解决方案
报错原因
你的方法中self的生命周期标注存在过度绑定的问题,将Parser实例自身的生命周期和内部持有的字符串引用的生命周期'a强行绑定到了一起:
next、nnext等方法标注了&'a self,要求调用方法的Parser实例本身的存活时长必须和内部&'a str的生命周期完全一致- 调用
self.next()时生成的是临时Parser实例,这个实例仅在nnnext方法内部有效,生命周期远短于'a - 按照你写的生命周期规则,临时实例调用
nnext()返回的Parser会绑定这个临时实例的生命周期,方法结束临时实例销毁,编译器自然会判定返回值引用了已销毁的临时数据。
修复方案
Parser生成新实例时只需要复用内部生命周期为'a的字符串引用,和当前调用方法的Parser实例自身存活时长无关,因此不需要给self绑定'a生命周期,修改后代码如下:
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() } } fn parse(s: &str){ let parser = Parser::new(s); parser.nnnext(); }
修改后返回的Parser<'a>的生命周期仅和最开始传入的源字符串生命周期绑定,和调用方法的Parser实例无关,self.next()生成的临时实例销毁不会影响最终返回值的合法性,编译即可通过。
内容的提问来源于stack exchange,提问作者Hatatister
相关产品推荐
相关产品推荐

