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

为何这段Rust代码中的'static生命周期无法满足要求?

为什么带有'static生命周期注解的引用会触发“借用值生命周期不足”错误?

问题重现

我写了一段Rust代码,预期能正常编译:

let mut some_str: &'static str = "Hello world";
let _borrow: &'static mut &'static str = &mut some_str;

但编译时收到以下错误:

--> src/lib.rs:26:50
   |
25 |         let mut some_str: &'static str = "Hello world";
   |             ------------ binding `some_str` declared here
26 |         let _borrow: &'static mut &'static str = &mut some_str;
   |                      -------------------------   ^^^^^^^^^^^^^ borrowed value does not live long enough
   |                      |
   |                      type annotation requires that `some_str` is borrowed for `'static`
27 |     }
   |     - `some_str` dropped here while still borrowed

我困惑的点在于:我认为两个引用都是'static生命周期,应该匹配,但错误提示some_str在被借用时就被销毁了,想知道原因。

原因解析

你混淆了变量自身的生命周期和变量所指向数据的生命周期:

  • some_str是一个栈上的可变变量,它的生命周期仅限于当前代码块(从声明到代码块结束的}),和'static完全无关。
  • some_str里面存储的&'static str是指向静态存储区中字符串字面量的引用,这个引用的生命周期才是'static。

当你写&mut some_str时,你创建的是指向some_str这个栈变量的可变引用,而不是指向它所引用的字符串字面量的引用。这个可变引用的生命周期默认是some_str的生命周期(即代码块内),但你强行给它注解了&'static mut &'static str,要求这个可变引用必须能存活到整个程序运行期间。

但some_str在代码块结束时就会被销毁,此时这个被注解为'static的可变引用还“指着”已经不存在的变量,这显然违反了Rust的内存安全规则,所以编译器报错。

修正方案

如果你只是想得到一个指向静态字符串的可变引用,不需要借用栈变量some_str,可以直接创建:

let _borrow: &'static mut &'static str = &mut "Hello world";

或者去掉不必要的'static注解,让编译器自动推导生命周期:

let mut some_str: &'static str = "Hello world";
let _borrow = &mut some_str;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:13:20