MST

星途 面试题库

面试题:Rust中生命周期省略规则的基础应用

请解释Rust中生命周期省略规则在函数参数和返回值方面的应用。假设你有一个函数,它接收两个字符串切片并返回其中较长的一个,用代码示例说明如何利用生命周期省略规则编写该函数,同时解释为什么这样写是可行的。
45.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

生命周期省略规则

  1. 函数参数
    • 对于函数参数,Rust 有三条生命周期省略规则:
      • 每个使用&的输入参数都有它自己的生命周期参数。例如,如果函数有两个参数&T&U,它们分别有自己的生命周期参数,如fn foo<'a, 'b>(x: &'a T, y: &'b U) {... }
      • 如果只有一个输入参数是&引用类型,那么这个引用的生命周期被赋予所有输出生命周期参数。例如fn bar<'a>(x: &'a T) -> &'a U {... }
      • 如果有多个输入参数是&引用类型,但其中一个是&self&mut self(在方法中),那么self的生命周期被赋予所有输出生命周期参数。
  2. 函数返回值
    • 当函数返回值是&引用类型时,如果函数有符合上述规则的输入参数引用,返回值的生命周期会从输入参数的生命周期推导出来。如果没有合适的输入参数引用可用于推导(例如函数没有输入参数引用),那么需要显式指定返回值的生命周期。

代码示例

fn longest(x: &str, y: &str) -> &str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

解释

  1. 符合生命周期省略规则
    • 这个函数接收两个&str类型的参数xy。根据生命周期省略规则的第一条,每个输入参数都有它自己的生命周期参数,虽然这里没有显式写出。
    • 函数返回值是&str类型。由于函数有两个输入参数都是&str类型,根据生命周期省略规则,返回值的生命周期会从输入参数的生命周期推导出来。这里返回值的生命周期与传入的xy的生命周期相关联,具体取决于哪个字符串切片更长。因此,不需要显式地指定生命周期参数,Rust 编译器可以通过生命周期省略规则来推断正确的生命周期。这样写是可行的,因为编译器能够根据这些规则确定函数中所有引用的生命周期关系,从而确保内存安全。