此问题已在此处有答案:
Why are explicit lifetimes needed in Rust?(10个答案)
14天前关闭
在Rust书中,给出了生命周期注解(LA)的这样一个例子如下。
它使用LA是有理由的,因为编译器和我们都不知道在运行时返回的是a
还是b
。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
但是,如果这个函数只是返回y
,甚至是一个static &str,编译器仍然希望返回中有一个命名的LA参数。为什么它不能在编译时读取函数内容并为我们做出正确的决定?
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
y
// "str slice" <-- or return a static value
}
1条答案
按热度按时间jc3wubiy1#
编译器要求在最长函数的返回类型中使用生命周期注解,即使它总是返回y或静态值,因为生命周期注解(命名为LA参数)指示了输入参数中的引用和被返回的引用之间的关系。
在您提供的第一个示例中,函数有条件地返回
x
或y
,因此生命周期注解'a
是必要的,因为返回的引用与两个输入字符串中较短的一个的生命周期相关。编译器需要这些信息来确保返回的引用始终有效,并且不会引用已释放的内存。在第二个例子中,函数无条件返回
y
或static value
,生命周期注解看起来似乎是不必要的,因为没有任何条件逻辑影响返回引用的生命周期。然而,Rust编译器目前没有对函数体进行深入分析,以确定是否可以省略生存期注解。