由于要求冲突,无法推断借用表达式的适当生存期


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

我不明白需求冲突来自哪里。Afaik没有冲突,因为一切都像FooStruct一样长

让我们把它拆开:

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
}
}

最新更新