为什么这个结构成员需要两个生命周期?

时间:2016-04-09 01:07:33

标签: rust lifetime

我有以下.mainContent { position:relative; /* you're missing a position */ z-index: 10; /* in order for z-index to apply */ }

struct

哪个struct PeekableRead<'a, R: Read> { reader: &'a mut R, peeked_octet: Option<u8>, } 不喜欢:

rustc

如果我将生命周期添加到…:27:1: 30:2 error: the parameter type `R` may not live long enough [E0309] …:27 struct PeekableRead<'a, R: Read> { …:28 reader: &'a mut R, …:29 peeked_octet: Option<u8>, …:30 } …:27:1: 30:2 help: run `rustc --explain E0309` to see a detailed explanation …:27:1: 30:2 help: consider adding an explicit lifetime bound `R: 'a`... …:27:1: 30:2 note: ...so that the reference type `&'a mut R` does not outlive the data it points at …:27 struct PeekableRead<'a, R: Read> { …:28 reader: &'a mut R, …:29 peeked_octet: Option<u8>, …:30 } ,例如R,则可行。但为什么?引用上的R: Read + 'a是否指定了生命周期?不能'areader: &'a mut R生活,只要结构本身,因此,&#34;足够长&#34;?

奇怪的是,我似乎需要两个;如果我将struct PeekableRead<'a>添加到'a并将其从引用中删除,我仍会获得R。我获得成功编译的唯一方法是使用两者,但对我来说,它们似乎冗余地指定了同样的东西。

(另外,为什么error: missing lifetime specifier在输出中两次输出rustc?第二个看起来像是建议做什么,但看起来和我的完全一样......)

2 个答案:

答案 0 :(得分:2)

  

引用上的'a是否指定了生命周期?

它指定引用的生命周期,但不指定指向的值的生命周期。这解释了你的观察

  

如果我将'a添加到R并从引用中删除它,我仍然会收到错误:缺少生命周期说明符。

要使结构有效,我们需要两者:指向的值必须仍然存在,引用也必须如此。 (虽然从逻辑上讲,第二个条件暗示了第一个条件,因为引用永远不会超过它指向的值。)。

答案 1 :(得分:1)

引用上的lifetime参数指定引用对象的生命周期(即引用指向的对象)。该对象可以是引用,也可以是包含一个或多个引用的复杂对象。但是,当你使用特征时,这些引用背后的对象的生命周期有些隐藏(特征本身并不知道这些生命周期);生命周期边界是让编译器正确推理这些生命周期的原因。

在引用后面使用泛型类型时,需要添加一个绑定以确保该类型的实例不包含比对这些实例的引用短的引用。仅基于您使用类型的方式不会隐式添加边界:边界不应根据结构中的字段的详细信息以及您定义它们的类型来更改。

例如,类型 public function __construct() { $this->middleware('auth', ['except' => [ 'about', 'index', ]]); } } (对于每个&'f File)实现'f。我们可以使用该类型实例化Read:这会给我们一个PeekableReadPeekableRead<&'f File>存储了对PeekableRead<&'f File>的可变引用,因此&'f File字段的具体类型为reader。为了使此类引用有效,&'a mut &'f File必须更短或等于'a。如果'f'f短,那么您可以将'a替换为在删除引用之前删除的&'f File,从而导致悬空指针。当您将'a绑定到R时(即当您撰写R: Read + 'a时),您说&#34; R的实例必须超过'a R } &#34; (即'a可能不包含短于HawaiiFive02010SXXEXXW.ac3 Nashville2012SXXEXXW.ac3 HowToGetAwayWithMurderSXXEXXW.ac3 BetterCallSaulSXXEXXW.ac3 BeautyAndTheBeast2012SXXEXXW.ac3 )的引用。