Rust 中的一个生命周期问题,一个悬空引用

A Lifetime problem in Rust, a Dangling Reference

我是一个 Rust 初学者,我刚刚了解了 Rust 中生命周期的概念。在教程中,它给了我下面的代码

fn longer<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}

fn main() {
    let r;
    {
        let s1 = "rust";
        let s2 = "ecmascript";
        r = longer(s1, s2);
        println!("{} is longer", r);
    }
}

它告诉我只有使用生命周期注释来告诉两个引用具有相同的生命周期,所以它可以return一个引用。 所以我自己尝试了代码并将代码稍微更改如下

fn main() {
    let r;
    {
        let s1 = "rust";
        let s2 = "ecmascript";
        r = longer(s1, s2);
    }
    println!("{} is longer", r);
}

事实证明代码正确地通过了编译和 运行,但我认为在 println! 阶段,r 应该是一个悬挂引用,所以谁能告诉我发生了什么事?

字符串文字的生命周期为 'static,因此只要程序在 运行.

期间它们就有效

这就是为什么您的内部块不是返回对局部变量的引用,而是对全局应用程序内存的引用。

如果您将字符串文字更改为拥有的字符串,您将收到预期的错误消息:

fn main() {
    let r;
    {
        let s1 = "rust".to_owned();
        let s2 = "ecmascript".to_owned();
        r = longer(&s1, &s2);
    }
    println!("{} is longer", r);
}
error[E0597]: `s1` does not live long enough
 --> src/main.rs:6:20
  |
6 |         r = longer(&s1, &s2);
  |                    ^^^ borrowed value does not live long enough
7 |     }
  |     - `s1` dropped here while still borrowed
8 |     println!("{} is longer", r);
  |                              - borrow later used here