跳转至

生命周期

目标与意义#

帮助编译器执行一个简单的规则:引用不应该活得比所指对象长(no reference should outlive its referent)。

因此,需要记住的第一件事就是,它们全都是关于引用(references)的,与其他东西无关。

生命周期这个词被宽泛地用来指代三种不同的东西——变量真实的生命周期、生命周期约束和生命周期标注。所以令人困惑!

变量的生命周期#

变量的生命周期,就是其作用域。全局、函数、语句块等。变量在生命周期结束会被自动调用Drop释放。

一般来说,堆内存的生命周期,会默认和其栈内存的生命周期绑定在一起。

生命周期约束#

变量在代码中的交互方式对它们的生命周期有一定的约束。例如,在下面的代码中,x=&y;这一行添加了一个约束,x的生命周期应该封闭在y的生命周期之内。

约束并不改变真实的生命周期。

生命周期标注#

所有变量都有生命周期标注,只不过编译器自动标注了绝大多数场景。

要创建一个生命周期标注,必须先声明一个**生命周期参数**。例如,<'a>是一个生命周期声明。生命周期参数是一种泛型参数,你可以把<'a>读作"对于某生命周期'a..."。一旦一个生命周期参数被声明,它就可以在**引用**中使用以创建一个生命周期约束。

一般而言,当相同的生命周期参数标注了一个函数中两个及以上的参数,返回的引用必须不能活得比参数生命周期中最小的那个长。

生命周期省略#

被省略的不是生命周期,而是生命周期标注以及对应的生命周期约束。

下列2、3情况中可以省略生命周期标注:

  • 所有引用类型的参数都有独立的生命周期 'a 、'b 等。
  • 只有一个输入引用时。
  • 当有多个输入引用,但是第一个参数是&self或者&mut self时。

评论

Back to top