我在Rust中遇到过几种以单引号标记的类型:
'static
'r
'a
那个撇号(')的意义是什么?也许它是引用(&
)的修饰符?是针对引用的通用键入方式吗?我不知道这个文档在哪里隐藏。
我在Rust中遇到过几种以单引号标记的类型:
'static
'r
'a
那个撇号(')的意义是什么?也许它是引用(&
)的修饰符?是针对引用的通用键入方式吗?我不知道这个文档在哪里隐藏。
这些是Rust的命名生命周期。
引用自The Rust Programming Language:
生命周期注解不会改变参与的引用存在的时间。就像函数在签名指定通用类型参数时可以接受任何类型一样,当签名指定通用生命周期参数时,函数可以接受具有任何生命周期的引用。 生命周期注解所做的是将多个引用的生命周期相互关联。Rust中的每个引用都有一个生命周期,即该引用有效的范围。大部分情况下,生命周期都是隐式和推断出来的,就像大多数情况下类型都是推断出来的一样。与我们必须注明类型因为可能存在多种类型的情况类似,有时引用的生命周期可以以几种不同的方式相关联,因此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")
f<'r>
。为什么函数有生命周期规范?整个例子对我来说都是有意义的,即使在函数名称后面没有<'r>
;它添加了什么? - lmat - Reinstate Monica