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

Gre*_*olm 66 rust

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

'static
'r
'a
Run Code Online (Sandbox Code Playgroud)

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

quu*_*x00 50

这些是Rust命名的生命周期.

引用Rust编程语言:

Rust中的每个引用都有一个生命周期,这是该引用有效的范围.大多数时候生命周期是隐含的和推断的,就像大多数时间类型被推断一样.类似于我们必须注释类型因为可能有多种类型时,有些情况下引用的生命周期可能以几种不同的方式相关,因此Rust需要我们使用通用生命周期参数来注释关系,以便它可以确保在运行时使用的实际引用肯定是有效的.

生命周期注释不会改变所涉及的任何引用的生存时间.与签名指定泛型类型参数时函数可以接受任何类型的方式相同,当签名指定泛型生存期参数时,函数可以接受具有任何生命周期的引用.生命周期注释的作用是将多个引用的生命周期相互关联起来.

生命周期注释具有略微不寻常的语法:生命周期参数的名称必须以撇号开头'.生命周期参数的名称通常都是小写的,和泛型类型一样,它们的名称通常都很短.'a是大多数人用作默认名称的名称.生命周期参数注释&位于引用之后,空格将生命周期注释与引用的类型分开.

换句话说,寿命近似于执行范围,在该执行范围期间,参考指向的数据是有效的.Rust编译器将保守地推断出可能安全的最短寿命.如果您想告诉编译器引用的寿命超过最短估计值,您可以命名它,例如,输出引用与给定的输入引用具有相同的生命周期.

'static生命周期是一个特殊的生命周期,最长的住所有寿命的-该计划的持续时间.一个典型的例子是字符串"文字",它在程序/模块的生命周期中始终可用.

从幻灯片29开始,您可以从此幻灯片中获取更多信息.

Rust的生命周期也在某种程度上讨论了生命周期.


Nin*_*liu 20

为了补充 quux00 的出色答案,命名的生命周期也用于向 rust 编译器指示返回的借用变量的来源。

这个功能

pub fn f(a: &str, b: &str) -> &str {
  b
}
Run Code Online (Sandbox Code Playgroud)

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

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

pub fn f<'r>(a: &str, b: &'r str) -> &'r str {
//      ----              ---         ---
  b
}
Run Code Online (Sandbox Code Playgroud)

并按预期使用它

f("a", "b")
Run Code Online (Sandbox Code Playgroud)

  • “如果你想告诉编译器一个引用的寿命比最短估计的寿命长,你可以命名它,例如说输出引用与给定的输入引用具有相同的寿命。” 对于 Rust 的新手来说,我确实需要两个答案才能理解这一点。如果没有代码示例,他们的代码就不会点击,而我一直困惑为什么编译器在没有他们的描述的情况下会对代码产生问题。 (10认同)
  • 我想我理解这个例子中除了 `f&lt;'r&gt;` 之外的所有内容。为什么函数有生命周期规范?如果函数名称后面没有 `&lt;'r&gt;`,整个示例对我来说也是有意义的;它添加了什么? (3认同)
  • 为什么编译器不能自动推断变量 b 的寿命更长,因为返回的是 b ? (3认同)
  • @Ren它可以推断出这一点,但这将导致未指定的副作用和不可预见的后果,并且您必须通过代码来找出您允许副作用发生的位置。示例:堆上有一个 100 的数组。您访问第 501 个元素。数组很好,所以它会增长以适应它。现在你有一个副作用,其原因隐藏在代码或数据中。 (2认同)