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

为何Rust未访问不可变借用时仍因可变借用访问报错?

Rust借用规则的疑惑:两段相似代码为何行为不同

先看这段会报错的代码:

fn main() {
    let mut v = vec![];
    let z = &mut v;
    let y = &v; // 此处已触发借用冲突
    z.push(1);
    println!("{:?}",z); //accessing mutable borrow
}

你觉得没访问y就应该编译通过,但Rust的借用检查器核心管的是是否存在同时活跃的冲突借用,而非借用有没有被实际使用。这段代码里,先创建了v的可变借用z,且z后续还要被用来push元素和打印,处于活跃状态;之后又创建不可变借用y,直接违反了“同一时间只能存在一个可变借用,或多个不可变借用,两者不能混合”的规则,因此直接报错。

再看这段能正常编译的代码:

fn main() {
    let mut v = vec![];
    let y = &v;
    let z = &mut v;
    z.push(1);
    println!("{:?}",z); // accessing mutable borrow
}

这里先创建不可变借用y,但后续没有任何代码用到y。Rust的非词法生命周期(NLL)特性会自动分析出y的借用在创建z之前就已经“失效”——相当于y的作用域提前结束,所以创建z时没有活跃的不可变借用,自然不会触发冲突。

最后这段报错的逻辑很好理解:

fn main() {
    let mut v = vec![];
    let y = &v;
    let z = &mut v;
    z.push(1);
    println!("{:?}",y); // accessing immutable borrow
}

因为最后访问了y,y的借用会持续到println执行完毕,此时z的可变借用仍处于活跃状态,两者冲突,因此报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:07:35