gotchaMajorpending
Rust borrow checker -- cannot borrow as mutable because also borrowed as immutable
Viewed 0 times
borrow checkermutable immutableE0502E0499NLLinterior mutability
rust
Error Messages
Problem
Rust compiler rejects code that borrows a value mutably while an immutable borrow exists. This prevents writing patterns that seem natural in other languages.
Solution
Rust enforces: either one mutable reference OR any number of immutable references, never both simultaneously. Fixes: (1) Scope borrows: ensure immutable borrow is dropped before mutable borrow. (2) Clone to break the borrow. (3) Use interior mutability (Cell, RefCell, Mutex) when needed. (4) Restructure code to avoid overlapping borrows. NLL (Non-Lexical Lifetimes) in modern Rust helps -- borrows end at last use, not end of scope.
Why
Data races require two conditions: aliasing (multiple references) and mutation. Rust prevents this at compile time by ensuring you cannot have both simultaneously.
Code Snippets
Borrow checker fix patterns
let mut v = vec![1, 2, 3];
// WRONG: immutable borrow overlaps with mutable
let first = &v[0]; // immutable borrow
v.push(4); // mutable borrow -- ERROR!
println!("{}", first); // immutable still in use
// RIGHT: immutable borrow ends before mutable
let first = v[0]; // copy, not borrow
v.push(4); // OK!
// RIGHT: scope the borrow
{
let first = &v[0];
println!("{}", first);
} // immutable borrow ends here
v.push(4); // OK!Revisions (0)
No revisions yet.