面试题答案
一键面试fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &'a str
where
'a: 'b,
{
if x.len() > y.len() {
x
} else {
y
}
}
解释:
- 函数
longest
定义了两个生命周期参数'a
和'b
,分别对应两个字符串切片参数x
和y
的生命周期。 - 函数返回类型标注为
&'a str
,并且通过where 'a: 'b
约束,确保了返回值的生命周期'a
至少和'b
一样长。这样无论x
和y
哪个生命周期更长,函数返回的引用都能满足借用检查。如果不添加where 'a: 'b
,编译器可能会报错,因为它需要明确返回值的生命周期与参数生命周期的关系。 - 在函数体中,根据字符串长度来决定返回
x
还是y
。
如果希望返回更长生命周期的引用,可以这样修改:
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &'static str
where
'a: 'static,
'b: 'static,
{
if x.len() > y.len() {
x
} else {
y
}
}
这种情况下,函数要求x
和y
都具有'static
生命周期,返回值也是'static
生命周期的引用。实际应用中,这种方式适用于输入引用本身就是'static
的场景,比如字符串字面量。