用一个撇号(’)表示的标识符是什么?

我在 Rust 中遇到过很多类型,只用一个撇号表示:

'static
'r
'a

那个撇号(’)的意义是什么?也许是引用的修饰语(&) ?特定于引用的泛型类型?我不知道这些文件藏在哪里。

24711 次浏览

这些是 Rust 命名的生命。

引自 < em > Rust 程序设计语言 :

Rust 中的每个引用都有一个生命周期,这是该引用有效的作用域。大多数时间生命周期是隐式的和推断的,就像大多数时间类型是推断的一样。类似于我们因为可能有多个类型而不得不对类型进行注释,在某些情况下,引用的生命周期可能以几种不同的方式相关联,因此 Rust 需要我们使用通用生命周期参数对关系进行注释,以确保在运行时使用的实际引用肯定是有效的。

生存期注释不会改变任何引用的长度 函数可以接受任何类型 签名指定泛型类型参数,函数可以接受 当签名指定泛型时,引用具有任何生存期 生存期注释所做的是将 多个相互引用的生命周期。

生命周期注释有一个稍微不同寻常的语法: 名称为 生存期参数必须以撇号 '开始 生存期参数通常都是小写的,与泛型类型一样, 他们的名字通常很短。 'a是大多数人使用的名字 生命周期参数注释位于 引用,并且空格将生存期注释与 引用的类型。

另一种方法是,生存期近似于引用指向的数据有效期间的执行跨度。Rust 编译器将保守地推断出尽可能短的安全生存期。如果您想告诉编译器一个引用的生存期比最短的估计长,您可以命名它,例如说输出引用的生存期与给定的输入引用的生存期相同。

'static生命周期是一个特殊的生命周期,是所有生命周期中生命周期最长的-在程序的持续时间内。一个典型的例子是字符串“文字”,它在程序/模块的生命周期中始终可用。

您可以从 这个幻灯片获得更多信息,从幻灯片29左右开始。

《锈中的生命》也在一定程度上讨论了生命周期。

为了补充 quux00的优秀答案,命名生命周期还用于向生锈编译器指示返回的借用变量的起源。

这个函数

pub fn f(a: &str, b: &str) -> &str {
b
}

将不会编译,因为它返回一个借来的值,但是没有指定它是从 a还是 b借来的。

为了解决这个问题,需要声明一个命名生存期,并对 b和返回类型使用相同的生存期:

pub fn f<'r>(a: &str, b: &'r str) -> &'r str {
//      ----              ---         ---
b
}

并按照预期使用它

f("a", "b")