fn longer_slice(slice1: &str, slice2: &str) -> &str {
if slice1.len() > slice2.len() {
slice1
} else {
slice2
}
}
Rust的生命周期省略规则应用
- 参数的生命周期:在函数签名
fn longer_slice(slice1: &str, slice2: &str) -> &str
中,slice1
和 slice2
都有一个未显式声明的生命周期。根据生命周期省略规则,每个引用参数都被赋予一个单独的生命周期参数。在这个例子中,可以认为 slice1
有生命周期 'a
,slice2
有生命周期 'b
。
- 返回值的生命周期:返回值类型
&str
同样没有显式的生命周期参数。按照生命周期省略规则,当函数的返回类型是引用类型,且该引用类型来源于函数参数中的某个引用时,返回值的生命周期与该参数的生命周期相同。在这个函数中,返回值要么是 slice1
要么是 slice2
,所以返回值的生命周期会与较长的那个切片的生命周期相同。在没有歧义的情况下,编译器可以推断出返回值的生命周期与输入参数中较长切片的生命周期一致。
省略安全的原因
- 没有创建悬垂引用:函数返回的是输入参数中的某个切片,并没有创建新的引用指向一个在函数结束后可能会被释放的临时对象。因此,不存在悬垂引用的风险。
- 编译器能够推断:编译器可以根据代码逻辑和生命周期省略规则,准确地推断出每个引用的生命周期,从而保证在函数调用期间,所有被引用的数据都是有效的。只要函数调用的参数满足其生命周期要求,函数返回的引用也会是有效的,因为它的生命周期与输入参数中的某个引用的生命周期相关联。