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
相关产品推荐
相关产品推荐

