繁体   English   中英

由于需求冲突,无法为借用表达式推断出适当的生命周期

[英]cannot infer an appropriate lifetime for borrow expression due to conflicting requirements

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM