cannot borrow X as mutable because it is also borrowed as immutable means youβre trying to mutate data while an immutable reference to it still exists.
Why Rust does this
Rust prevents data races at compile time. You can have either multiple immutable references OR one mutable reference β never both at the same time.
Fix 1: Limit the scope of borrows
// β Immutable borrow lives too long
let r = &vec[0];
vec.push(4); // Error: can't mutate while r exists
println!("{}", r);
// β
Use r before mutating
let r = &vec[0];
println!("{}", r); // r is no longer used after this
vec.push(4); // Now this works
Fix 2: Clone the data
// β
Clone to avoid borrowing
let value = vec[0].clone();
vec.push(4);
println!("{}", value);
Fix 3: Use indices instead of references
// β
Store the index, not a reference
let idx = 0;
vec.push(4);
println!("{}", vec[idx]);
Fix 4: Use RefCell for interior mutability
use std::cell::RefCell;
let data = RefCell::new(vec![1, 2, 3]);
let r = data.borrow();
// data.borrow_mut().push(4); // Panics at runtime instead of compile error
Only use RefCell when you canβt restructure the code. Compile-time checks are always better than runtime panics.
Related: Rust cheat sheet Β· Rust: Trait Bound Not Satisfied Β· Rust: Does Not Live Long Enough Β· Cargo Cheat Sheet