Rust中两种向量元素赋值方式的差异及所有权/借用解析
两种向量元素赋值方式的差异与所有权/借用分析
1. 直接赋值:v[0] = v[1]
这种写法能通过编译的核心原因是两个借用无重叠:
- 执行时会先读取
v[1]的值:这会临时对向量v产生一个不可变借用(&v[1]),但读取操作完成后,这个借用立刻被释放,不会继续存活。 - 紧接着执行
v[0]的赋值:此时对向量v产生一个可变借用(&mut v[0]),赋值完成后这个可变借用也被释放。 - Rust编译器能识别这种“先后发生、无重叠”的借用场景,完全符合借用规则,因此允许执行。
2. 先保存引用再赋值:编译失败的原因
这段代码违反了Rust的核心借用规则——同一时间内,一个值不能同时存在可变引用和任何不可变引用:
let v0 = &mut v[0];创建了指向v[0]的可变引用,这个引用的生命周期会持续到v0被销毁(函数结束前)。- 后续
let v1 = &v[1];尝试创建指向v[1]的不可变引用时,v已经有一个存活的可变引用v0。当前Rust的借用检查器不会细化判断“引用指向不同元素”,只会认为整个向量处于可变借用状态,因此禁止创建新的不可变引用,直接编译报错。
内容的提问来源于stack exchange,提问作者User 10482
相关产品推荐
相关产品推荐

