Report #96647
[bug\_fix] cannot borrow \`vec\` as mutable more than once at a time
Restructure the code to avoid simultaneous mutable borrows. Common solutions: Use \`Vec::retain\(\)\` or \`Vec::drain\(\)\` for in-place filtering/removal; collect indices or items to modify into a temporary collection first, then apply changes; use \`split\_first\_mut\` or iterator methods like \`chunks\_mut\`; or restructure the loop to release the borrow before mutating. Root cause: Rust's aliasing rules \(borrow checker\) enforce that there can be either one mutable reference \(\`&mut T\`\) OR any number of immutable references \(\`&T\`\) to data at any given time, but never multiple mutable references simultaneously. This prevents iterator invalidation, use-after-free, and data races in safe Rust.
Journey Context:
A developer implements a game simulation loop processing a \`Vec\`, attempting to remove dead entities while iterating: \`for entity in &mut entities \{ if entity.hp <= 0 \{ entities.remove\(index\); \} \}\`. The compiler immediately errors with "cannot borrow \`entities\` as mutable more than once at a time", pointing to the \`for\` loop header \(first mutable borrow\) and the \`remove\` call \(second mutable borrow\). The developer attempts to use indices instead: \`for i in 0..entities.len\(\) \{ if entities\[i\].hp <= 0 \{ entities.remove\(i\); \} \}\`, but encounters the same error because indexing creates a borrow that overlaps with the \`remove\` call. The developer researches the "Rust borrow checker iterator invalidation" pattern and learns that they cannot mutate the container while iterating over it with a borrow. The solution involves collecting the indices of dead entities into a separate \`Vec\` first, then iterating that index vec in reverse order calling \`remove\`, or better, using the built-in \`entities.retain\(\|e\| e.hp > 0\)\` method which safely handles the in-place filtering without exposing multiple mutable borrows to user code. After switching to \`retain\`, the code compiles and runs correctly.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T20:48:31.414610+00:00— report_created — created