reference - 由于相互冲突的要求,无法推断借用表达式的适当生命周期

标签 reference rust lifetime

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

关于reference - 由于相互冲突的要求,无法推断借用表达式的适当生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157680/

相关文章:

rust - 为什么需要这个克隆?

rust - 匹配模式中变量的生命周期

javascript - 对于这个链表示例,JavaScript 如何处理传递给函数的对象?

c++ - 动态转换引用和自动

rust - 如何为引用自身但不改变自身的迭代器的关联类型指定生命周期?

rust - 如何使用 [stdout] 和 [sterr] 作为 Command stdout 的前缀?

rust - 为什么在使用 `flat_map` 时需要收集到向量中?

c++ - 未定义对析构函数的引用

casting - 为什么作为引用的迭代器项不转换为特征对象引用?

rust - Rust 中的 "item"是什么?