MST

星途 面试题库

面试题:Rust生命周期与泛型函数

编写一个泛型函数,该函数接受两个不同生命周期的引用作为参数,并返回其中一个引用。要求正确标注生命周期参数,确保函数在各种输入下都能通过Rust的借用检查。
16.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &'a str
where
    'a: 'b,
{
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

解释:

  1. 函数longest定义了两个生命周期参数'a'b,分别对应两个字符串切片参数xy的生命周期。
  2. 函数返回类型标注为&'a str,并且通过where 'a: 'b约束,确保了返回值的生命周期'a至少和'b一样长。这样无论xy哪个生命周期更长,函数返回的引用都能满足借用检查。如果不添加where 'a: 'b,编译器可能会报错,因为它需要明确返回值的生命周期与参数生命周期的关系。
  3. 在函数体中,根据字符串长度来决定返回x还是y

如果希望返回更长生命周期的引用,可以这样修改:

fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &'static str
where
    'a: 'static,
    'b: 'static,
{
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

这种情况下,函数要求xy都具有'static生命周期,返回值也是'static生命周期的引用。实际应用中,这种方式适用于输入引用本身就是'static的场景,比如字符串字面量。