MST
星途 面试题库

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

请举例说明在Rust函数参数中,符合生命周期省略规则的常见场景,并解释这些场景下编译器如何推断生命周期。
39.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

常见场景及编译器推断方式

  1. 参数和返回值中只有一个引用
    • 示例
fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
    &s[..]
}
- **编译器推断**:在此场景下,编译器会将参数 `s` 的生命周期赋予返回值。因为只有一个引用 `s`,编译器简单认为返回值引用与参数引用的生命周期相同。

2. 多个参数,其中只有一个是引用,且返回值是引用: - 示例

fn longest(s1: &str, num: i32) -> &str {
    if num > 0 {
        s1
    } else {
        "default string"
    }
}
- **编译器推断**:编译器将参数 `s1` 的生命周期赋予返回值。由于只有 `s1` 是引用,所以推断返回值的生命周期与 `s1` 相同。

3. 方法调用,self&mut self 是唯一引用参数: - 示例

struct Example {
    data: String,
}
impl Example {
    fn get_data(&self) -> &str {
        &self.data
    }
}
- **编译器推断**:编译器推断返回值的生命周期与 `self` 的生命周期相同。因为 `self` 是唯一的引用参数,返回值引用自 `self` 内部数据,所以生命周期与 `self` 一致。