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
)
我有一个小虚拟解析器,它在解析过程中使用相同的 &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
)