面试题答案
一键面试// 定义包含字符串切片的结构体
struct StringSliceContainer<'a> {
slices: &'a [&'a str],
}
// 为结构体实现方法
impl<'a> StringSliceContainer<'a> {
fn concatenate(&self, other_slices: &'a [&'a str]) -> Vec<&'a str> {
let mut result = self.slices.to_vec();
result.extend(other_slices);
result
}
}
Rust生命周期省略规则在结构体方法中的作用
- 省略规则概述:Rust 有一套生命周期省略规则,在方法定义中,如果参数列表中有且仅有一个
&self
或&mut self
,且方法返回值类型是引用类型,那么返回值的生命周期会被默认推断为与&self
的生命周期相同。 - 结构体方法中的作用:在我们实现的
concatenate
方法中,若不手动指定生命周期,编译器可以根据省略规则推断出正确的生命周期。因为方法参数只有&self
,返回值Vec<&str>
中的引用生命周期会被推断为与&self
中的引用生命周期一致,也就是结构体中切片的生命周期。
手动指定生命周期确保代码正确性
- 情况说明:如果省略规则不适用,例如方法有多个引用参数且返回值也是引用类型时,手动指定生命周期就很必要。
- 示例修改:假设我们有一个方法接收两个不同生命周期的切片并返回一个新切片。
struct StringSliceContainer<'a> {
slices: &'a [&'a str],
}
impl<'a, 'b> StringSliceContainer<'a> {
fn custom_concat(&self, other_slices: &'b [&'b str]) -> Vec<&'a str> {
let mut result = self.slices.to_vec();
for slice in other_slices {
// 这里假设所有切片生命周期足够长,可以安全添加
result.push(slice);
}
result
}
}
在这个例子中,other_slices
有自己的生命周期 'b
,而返回值必须与结构体中切片的生命周期 'a
一致。手动指定生命周期 'a
和 'b
确保了编译器能正确理解各个引用的有效范围,从而保证代码正确性。