не может вывести подходящую продолжительность жизни для выражения заимствования из-за противоречивых требований - PullRequest
1 голос
/ 29 сентября 2019
pub struct FooStruct<'a> {
  pub bars: Vec<&'a str>,
}

pub trait FooTrait<'a> {
  fn getBars(&self) -> &'a Vec<&'a str>;
}

impl<'a> FooTrait<'a> for FooStruct<'a> {
  fn getBars(&self) -> &'a Vec<&'a str> {
    &self.bars // cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
  }
}

Запустите его: https://play.rust -lang.org /? Version = stable & mode = debug & edition = 2018 & gist = 3211c32dd5b9244ff91777f1820ffed5

Я не понимаю, откуда возникает конфликт требований. Афаик, нет конфликта, так как все живет до тех пор, пока живет FooStruct.

1 Ответ

2 голосов
/ 29 сентября 2019

Давайте разберем это:

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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...