Rust中生命周期标注基本规则
- 作用:生命周期标注主要用于告知编译器,不同引用之间的生命周期关系,确保引用在其生命周期内一直有效,防止出现悬垂引用。
- 语法:生命周期参数以单引号(
'
)开头,后跟一个名称,如'a
。
- 函数签名中规则:
- 如果函数有多个引用参数,每个引用参数可能需要不同的生命周期标注。例如
fn foo<'a, 'b>(x: &'a i32, y: &'b i32) { }
。
- 函数返回值如果是引用类型,其生命周期通常需要和参数中的某个引用生命周期相关联,以确保返回的引用在其使用时仍然有效。
函数参数和返回值中使用生命周期标注常见应用场景
- 函数参数场景:
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
if s1.len() > s2.len() {
s1
} else {
s2
}
}
- 在这个例子中,
longest
函数接受两个字符串切片引用s1
和s2
,它们都标注了相同的生命周期'a
。这表示在函数调用期间,这两个引用必须在相同的生命周期内有效。
- 函数返回值场景:
struct Container {
data: String
}
fn get_ref<'a>(container: &'a Container) -> &'a str {
&container.data
}
- 这里
get_ref
函数返回一个对Container
内部数据的引用。返回值的生命周期'a
与参数container
的生命周期相同,保证了返回的引用在container
有效的期间一直有效。如果不标注正确的生命周期,编译器会报错,因为它不知道返回的引用在调用者使用时是否仍然有效。