面试题答案
一键面试struct Data {
value: String,
}
fn process<'a>(data1: &'a Data, data2: &'a Data) -> &'a String {
if data1.value.len() >= data2.value.len() {
&data1.value
} else {
&data2.value
}
}
生命周期推断为何失败
在Rust中,编译器会尝试自动推断函数参数和返回值的生命周期。但在这个场景下,编译器无法确定返回值的生命周期应该与哪个参数的生命周期绑定。因为返回值的生命周期虽然应该与data1
和data2
中至少一个的生命周期相同,但编译器不知道具体该与谁绑定,所以需要显式标注。
如何解决
通过在函数定义中显式标注生命周期参数'a
,表明data1
、data2
和返回值都具有相同的生命周期'a
。这样,编译器就明确了返回值的生命周期与传入参数的生命周期关系,确保在函数返回后,引用指向的内存依然有效。