什么是用单撇号表示的Rust类型?

时间:2014-02-26 17:22:41

标签: rust

我在Rust中遇到过一些用撇号表示的类型:

'static
'r
'a

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

2 个答案:

答案 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")