结论:Rust 借用规则保证"任意时刻,要么存在恰好一个可变借用 &mut T,要么存在任意多个不可变借用 &T,二者不能共存"。两个可变借用并存意味着数据可能在两条路径上被同时改写,这正是数据竞争和迭代器失效等经典 bug 的根源,Rust 选择在编译期直接拒绝。
展开:不可变借用是"共享只读",数量不限;可变借用是"独占可写"。该规则在单线程同样生效,因为它同时防止了迭代过程中修改集合(iterator invalidation)、引用指向的内存被重新分配后变悬垂等问题。易错点:规则约束的是同一变量的"活跃"借用,NLL 下借用结束于最后一次使用,前后错开的两个 &mut 是合法的。追问方向:确实需要"共享 + 可变"怎么办?用 RefCell/Mutex 把可变性检查推迟到运行时,即内部可变性模式。
let mut v = vec![1, 2];
let a = &mut v;
let b = &mut v; // 编译错误:a 仍然活跃
// 前后错开则合法:
let c = &mut v; c.push(3);
let d = &mut v; d.push(4);