我最近遇到了一个错误,只需更改一下就能轻松解决。
impl<'a> Foo<'a> {
fn foo(&'a self, path: &str) -> Boo<'a> { /* */ }
}
to
impl<'a> Foo<'a> {
fn foo(&self, path: &str) -> Boo { /* */ }
}
根据我的理解,第二个版本应该与应用了生命周期省略的第一个版本完全相同,这似乎不合理。
假如我们为该方法引入一个新的生命周期,就像这个nomicon的示例所述,情况似乎是这样的。
fn get_mut(&mut self) -> &mut T; // elided
fn get_mut<'a>(&'a mut self) -> &'a mut T; // expanded
那么这段代码和我的第一份代码有什么区别呢?
Boo<'b>
应该与借用的&'b self
一样长。也就是说,当Boo<'b>
不再在它被取出的词法范围内时,self
就不再被借用了。 - red75prime&'a self
的生命周期绑定到结构体Foo<'a>
的生命周期。如果Foo<'a>
在'a
上是不变的,这意味着self
应该保持借用状态直到'a
结束。 - red75primeFoo
的方差会影响你的代码。 - red75prime&str
,这不会阻止变异。 - lncr