You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust生命周期与&str的交互:为何这段代码可编译运行?

为什么这段Rust代码能编译并输出"nooooo"?

先看你提供的代码:

fn longest<'a>(a: &'a str, b: &'a str) -> &'a str{
    if a.len() > b.len() {
        a
    } else {
        b
    }
}

fn main() {
    let a = "hi";
    let c: &str;
    {
        let b = "nooooo";
        c = longest(a, b);
    }
    print!("{c}");
}

关键原因在于字符串字面量的特殊生命周期:

  • Rust里的字符串字面量(比如"hi"、"nooooo")属于&'static str类型,'static意味着它们会被直接编译进程序的二进制文件,在程序运行的整个周期内都存在,不受创建它们的作用域限制。
  • 变量b虽然在内部作用域中定义,但它指向的"nooooo"是'static生命周期的字符串。当调用longest时,编译器会自动将'static生命周期适配为函数泛型参数'a——而由于a也是'static,'a会被推断为覆盖外部作用域的生命周期,完全满足c后续使用的要求。
  • 内部作用域结束时,只是变量b这个引用本身被销毁,但它指向的字符串数据依然存在,所以c持有的引用不会变成悬垂引用,自然能正常输出内容。

内容的提问来源于stack exchange,提问作者Dennis Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:04:59