我在Rust中遇到过一些用撇号表示的类型:
'static
'r
'a
撇号有什么意义?也许它是引用的修饰符(&
)?特定于引用的泛型类型?我不知道这个文档藏在哪里。
答案 0 :(得分:39)
这些是Rust命名的生命周期。
引自The Rust Programming Language:
Rust中的每个引用都有一个生命周期,这是该引用有效的范围。大多数时候生命周期是隐含的和推断的,就像大多数时间类型被推断一样。类似于我们必须注释类型因为可能有多种类型时,有些情况下引用的生命周期可能以几种不同的方式相关,因此Rust需要我们使用通用生命周期参数来注释关系,以便它可以确保在运行时使用的实际引用肯定是有效的。
生命周期注释不会改变任何引用的时长 涉及现场。与函数可以接受任何类型的方式相同 签名指定泛型类型参数,函数可以接受 签名指定泛型时的任何生命周期的引用 寿命参数。终身注释的作用与之相关 彼此多次引用的生命周期。
Lifetime注释的语法略有不寻常:名称 生命周期参数必须以撇号
'
开头。的名字 生命周期参数通常都是小写的,就像泛型类型一样 他们的名字通常很短。'a
是大多数人使用的名称 默认。生命周期参数注释位于a的&
之后 引用和空格分隔生命周期注释 参考类型。
换句话说,生命周期近似于执行范围,在该执行范围期间,参考指向的数据是有效的。 Rust编译器将保守地推断出可能安全的最短寿命。如果你想告诉编译器一个引用的寿命比最短估计的长,你可以命名它,例如,输出引用与给定的输入引用具有相同的生命周期。
'static
生命周期是一个特殊的生命周期,是所有生命周期中最长的一生 - 在整个计划期间。一个典型的例子是字符串“literals”,它在程序/模块的生命周期中始终可用。
从幻灯片29开始,您可以从this slide deck获取更多信息。
Lifetimes in Rust也在一定程度上讨论了生命周期。
答案 1 :(得分:0)
为增加quux00的出色答案,命名生命周期还用于指示rust编译器返回的借用变量的来源。
此功能
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")