MST

星途 面试题库

面试题:Rust 中生命周期省略规则在函数参数中的应用

假设有一个函数,接收两个字符串切片作为参数,并返回其中较长的那个切片。请写出该函数的代码,并说明在这个函数中,Rust 的生命周期省略规则是如何应用的,以及为什么这种省略是安全的。
43.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn longer_slice(slice1: &str, slice2: &str) -> &str {
    if slice1.len() > slice2.len() {
        slice1
    } else {
        slice2
    }
}

Rust的生命周期省略规则应用

  1. 参数的生命周期:在函数签名 fn longer_slice(slice1: &str, slice2: &str) -> &str 中,slice1slice2 都有一个未显式声明的生命周期。根据生命周期省略规则,每个引用参数都被赋予一个单独的生命周期参数。在这个例子中,可以认为 slice1 有生命周期 'aslice2 有生命周期 'b
  2. 返回值的生命周期:返回值类型 &str 同样没有显式的生命周期参数。按照生命周期省略规则,当函数的返回类型是引用类型,且该引用类型来源于函数参数中的某个引用时,返回值的生命周期与该参数的生命周期相同。在这个函数中,返回值要么是 slice1 要么是 slice2,所以返回值的生命周期会与较长的那个切片的生命周期相同。在没有歧义的情况下,编译器可以推断出返回值的生命周期与输入参数中较长切片的生命周期一致。

省略安全的原因

  1. 没有创建悬垂引用:函数返回的是输入参数中的某个切片,并没有创建新的引用指向一个在函数结束后可能会被释放的临时对象。因此,不存在悬垂引用的风险。
  2. 编译器能够推断:编译器可以根据代码逻辑和生命周期省略规则,准确地推断出每个引用的生命周期,从而保证在函数调用期间,所有被引用的数据都是有效的。只要函数调用的参数满足其生命周期要求,函数返回的引用也会是有效的,因为它的生命周期与输入参数中的某个引用的生命周期相关联。