面试题答案
一键面试常见场景及编译器推断方式
- 参数和返回值中只有一个引用:
- 示例:
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` 一致。