面试题答案
一键面试引用生命周期的约束规则
- 生命周期参数的标注:当函数参数或返回值涉及引用时,需要标注生命周期参数。生命周期参数一般以
'a
、'b
等形式表示。 - 参数生命周期约束:函数参数中的引用,其生命周期必须至少与函数调用的生命周期一样长。例如在函数
fn foo<'a>(x: &'a i32) {}
中,x
的生命周期'a
至少要和调用foo
函数的那部分代码的生命周期一样长。 - 返回值生命周期约束:返回值引用的生命周期必须受输入参数引用生命周期的约束。即返回值引用不能比输入参数引用存活时间更长。
函数参数和返回值中处理引用生命周期示例
// 函数参数中处理引用生命周期
fn print_number<'a>(number: &'a i32) {
println!("The number is: {}", number);
}
// 函数返回值中处理引用生命周期
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
if s1.len() > s2.len() {
s1
} else {
s2
}
}
在 print_number
函数中,number
引用的生命周期 'a
只要满足在函数调用期间存在即可。在 longest
函数中,返回值引用的生命周期 'a
与输入参数 s1
和 s2
的生命周期 'a
一致,确保返回的引用在调用者使用时仍然有效,避免编译错误。