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

