一、为什么需要生命周期?
回顾一下上节课埋下的伏笔——那个编译失败的 longest 函数:
rust
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
} else {
y
}
}编译器报错:
error[E0106]: missing lifetime specifier
--> src/main.rs:1:33
|
1 | fn longest(x: &str, y: &str) -> &str {
| ---- ---- ^ expected named lifetime parameter编译器在说:“我不知道返回的引用是来自 x 还是 y,因此我无法确定返回的这个引用到底能活多久。” 换句话说,它需要知道返回值的生命周期和输入参数的生命周期之间有什么关系。
如果返回 x,那么返回的引用只要 x 还活着就行;如果返回 y,那就要看 y 的存活时间。作为函数签名,编译器没法在编译时预知哪种情况发生,所以必须由你来标明这种关系。这就是生命周期参数登场的原因。