[英]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
保證該引用比所有 Parser 方法的壽命都長。 必須如何注釋生命周期來表達這一點? 特別是,為什么nnnext
不編譯? 應該清楚的是,引用self.next().nnext()
調用更有效。
非常感謝您提供的任何幫助。 亨德里克
通過使用&'a self
,您將解析器的生命周期與它所引用的字符串的生命周期混為一談。 沒有理由這樣做。
如果您刪除此約束,則不再有問題:
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(&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()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.