结构需要一辈子,因为?

时间:2016-03-03 12:49:45

标签: struct rust lifetime

(标有的每个声明都希望被声明)

我只是慢慢地活着。

由于生命周期省略有助于省略明确描述生命周期(),因此我们需要对其进行描述。

示例可能是包含引用的结构:

struct Person<a'>{
car: &'a Car
}

我是否正确,以下假设,

  

struct是一种值类型 - 因此它的内存位于堆栈中。在使用此结构的范围结束后 - 结构将死亡。但是由于这个结构包含对 Car 的引用,并且这个引用可能被借用到其他地方 - 只要Car引用正在使用中,结构需要保持活动状态。因此,只要Car正在使用,Lifetime &#39; a 就会告诉Person结构保持活跃状态​​。(

说实话,我不相信上面的这个陈述。因为在铁锈寿命的其他定义中我明白这一点 - 汽车需要保持活力至少与&#39; a 一样长,所以人不会有一个悬垂的指针。 / p>

2 个答案:

答案 0 :(得分:9)

  

由于生命周期省略有助于省略明确描述生命周期(),因此我们需要对其进行描述。

As 在这里,终身精益只是让你的生活更轻松(作为作家和读者)。生命周期仍然存在(语义上),但不需要明确表示(语法上)。

据我所知,Lifetime elision在struct定义中不起作用。它适用于函数签名和实体。

  

但是由于这个结构保存了对Car的引用,并且这个引用可能被借用到其他地方 - 只要Car引用正在使用,结构需要保持活动状态。

没有。终身的目标是避免悬挂引用,并指出借用关系。

  • 悬空引用是引用(长)死值的引用,可能在释放的内存中或(更糟糕的)在重用内存中。
  • 借用检查器使用借用关系来跟踪某人是否仍然具有对值的引用;虽然有人对某个值有引用,但不应将其移动或更改为其他类型,以免所述引用变为悬空。

有关悬挂引用的更深入解释,I recommend this question

因此,生命期是关于确保参考永远不会超过它所指的值。

因此,约束与您的信念相反:此处'a的目标是让编译器确保您的Person永远不会超过它所引用的Car。< / p>

答案 1 :(得分:7)

反过来说:结构包含一个引用,因此它可能不会超过引用所指向的内容。