我在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)