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

Rust中为何定义未使用的多个可变引用可通过编译?

为什么未使用的多个可变引用能通过Rust编译?

Rust的核心借用规则确实是:同一时间内,一个值不能存在多个活跃的可变引用,但这里的关键是“活跃”——也就是这个引用有没有被实际使用。

看你给出的代码:

fn tut(){
    let mut s = String::from("hello");
    let s1 = &mut s;
    let s2 = &mut s;
    let s3 = &mut s;
}

这里的s1、s2、s3只是被定义了,但从来没被使用过。对于编译器来说,这些未被使用的可变引用相当于“死代码”,它们的借用生命周期在后续变量定义时就已经结束了——因为没有任何代码需要依赖它们的存在,所以不会出现多个可变引用同时“活跃”的情况,自然不会触发借用规则的冲突。

如果稍微修改代码,比如尝试使用其中一个引用:

fn tut(){
    let mut s = String::from("hello");
    let s1 = &mut s;
    println!("{}", s1); // 使用s1
    let s2 = &mut s; // 这里会直接编译报错
}

这时候编译器就会报错,因为s1的借用在println之后仍然是活跃的,此时定义s2就违反了“同一时间只能有一个可变引用”的规则。

简单来说,Rust的借用检查器关注的是引用是否在同一时间段被实际使用,而不是单纯看变量的定义顺序。未被使用的可变引用因为没有实际参与任何操作,不会造成数据竞争的风险,所以编译器允许这种情况通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:52:06