簡體   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