Давайте разберем это:
pub struct FooStruct<'a> {
pub bars: Vec<&'a str>,
}
FooStruct
содержит контейнер, содержащий кусочки строк со временем жизни 'a
. Срок службы контейнера соответствует времени жизни FooStruct
.
pub trait FooTrait<'a> {
fn getBars(&self) -> &'a Vec<&'a str>;
}
FooTrait
хочет getBars
вернуть ссылку на контейнер, содержащий фрагменты строки со временем жизни 'a
. Время жизни возвращаемой ссылки также должно быть 'a
.
impl<'a> FooTrait<'a> for FooStruct<'a> {
fn getBars(&self) -> &'a Vec<&'a str> {
&self.bars
}
}
Здесь getBars
возвращает ссылку на self.bars
, который является контейнером срезов строк со временем жизни 'a
. Все идет нормально.
- Но каково время жизни
&self.bars
? Это соответствует времени жизни self
(то есть соответствующему FooStruct
). - Какое время жизни
self
? Это 'self
(неявное время жизни).
Однако FooTrait
требует, чтобы возвращаемое время жизни ссылки было 'a
, так что оно не соответствует объявлению FooTrait
.
Одним из решений является разделение времен жизни в FooTrait
:
pub trait FooTrait<'a> {
fn getBars<'s>(&'s self) -> &'s Vec<&'a str>;
}
impl<'a> FooTrait<'a> for FooStruct<'a> {
fn getBars<'s>(&'s self) -> &'s Vec<&'a str> {
&self.bars
}
}