【问题标题】:cannot infer an appropriate lifetime for borrow expression due to conflicting requirements由于需求冲突,无法为借用表达式推断出适当的生命周期
【发布时间】:2020-01-29 03:29:36
【问题描述】:
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 存在,一切都会存在。

【问题讨论】:

  • 'a 可能比FooStruct 的生命周期更长。那么拥有&amp;'a Vec&lt;_&gt; 是不合理的,因为Vec 不会持续整个'a

标签: reference rust lifetime


【解决方案1】:

让我们把它拆开:

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 的字符串切片的容器。到目前为止,一切都很好。

  • 但是,&amp;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
  }
}

【讨论】:

  • 谢谢。我的错误是错误假设FooStruct&lt;'a&gt;FooTrait&lt;'a&gt; 隐式绑定'aself。现在我明白了,它只是告知了这种生命的存在。明确&amp;self 的生命周期确实解决了这个问题。
猜你喜欢
  • 2022-01-06
  • 2017-05-07
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2016-06-01
  • 2021-11-02
  • 2017-07-12
  • 2016-05-21
相关资源
最近更新 更多