Rust编译器的生命周期注解[重复]

t98cgbkg  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(92)

此问题已在此处有答案

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

}
jc3wubiy

jc3wubiy1#

编译器要求在最长函数的返回类型中使用生命周期注解,即使它总是返回y或静态值,因为生命周期注解(命名为LA参数)指示了输入参数中的引用和被返回的引用之间的关系。
在您提供的第一个示例中,函数有条件地返回xy,因此生命周期注解'a是必要的,因为返回的引用与两个输入字符串中较短的一个的生命周期相关。编译器需要这些信息来确保返回的引用始终有效,并且不会引用已释放的内存。
在第二个例子中,函数无条件返回ystatic value,生命周期注解看起来似乎是不必要的,因为没有任何条件逻辑影响返回引用的生命周期。然而,Rust编译器目前没有对函数体进行深入分析,以确定是否可以省略生存期注解。

相关问题