【发布时间】:2014-03-29 17:04:00
【问题描述】:
我在 Rust 中遇到过许多用单个撇号表示的类型:
'static
'r
'a
那个撇号有什么意义?也许它是引用的修饰符(&)?特定于参考的通用类型?我不知道这方面的文档藏在哪里。
【问题讨论】:
标签: rust
我在 Rust 中遇到过许多用单个撇号表示的类型:
'static
'r
'a
那个撇号有什么意义?也许它是引用的修饰符(&)?特定于参考的通用类型?我不知道这方面的文档藏在哪里。
【问题讨论】:
标签: rust
这些是 Rust 命名的生命周期。
引用The Rust Programming Language:
Rust 中的每个引用都有一个生命周期,这是该引用有效的范围。大多数时间生命周期是隐含的和推断的,就像大多数时间类型是推断的一样。类似于我们必须注释类型,因为可能有多种类型,在某些情况下,引用的生命周期可能以几种不同的方式相关,因此 Rust 需要我们使用通用生命周期参数来注释关系,以便它可以确保在运行时使用的实际引用肯定是有效的。
生命周期注释不会改变任何引用的时长 参与直播。就像函数可以接受任何类型一样 签名指定泛型类型参数,函数可以接受 当签名指定泛型时具有任何生命周期的引用 寿命参数。生命周期注释所做的是将 多个相互引用的生命周期。
生命周期注解有一个稍微不寻常的语法: 生命周期参数必须以撇号
'开头。的名字 生命周期参数通常都是小写的,和泛型一样, 他们的名字通常很短。'a是大多数人使用的名称 默认。生命周期参数注释在&之后 引用,并且一个空格将生命周期注释与 引用的类型。
换句话说,生命周期近似于引用指向的数据有效的执行跨度。 Rust 编译器会保守地推断出尽可能安全的最短生命周期。如果你想告诉编译器一个引用的生命周期比最短的估计长,你可以命名它,例如,输出引用与给定的输入引用具有相同的生命周期。
'static 生命周期是一个特殊的生命周期,是所有生命周期中最长的生命周期 - 在程序期间。一个典型的例子是字符串“文字”,它在程序/模块的生命周期内始终可用。
您可以从this slide deck 获取更多信息,从幻灯片 29 开始。
Lifetimes in Rust 还深入讨论了生命周期。
【讨论】:
为了补充 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")
【讨论】: