🎯

m03-mutability

🎯Skill

from actionbook/rust-skills

VibeIndex|
What it does

Diagnoses and guides resolution of Rust mutability and borrowing conflicts by analyzing design patterns and recommending appropriate interior mutability strategies.

πŸ“¦

Part of

actionbook/rust-skills(35 items)

m03-mutability

Installation

Quick InstallInstall with npx
npx skills add ZhangHanDong/rust-skills
CargoRun with Cargo (Rust)
cargo install cowork
git cloneClone repository
git clone https://github.com/ZhangHanDong/rust-skills.git
Add MarketplaceAdd marketplace to Claude Code
/plugin marketplace add ZhangHanDong/rust-skills
πŸ“– Extracted from docs: actionbook/rust-skills
15Installs
-
AddedFeb 4, 2026

Skill Details

SKILL.md

"CRITICAL: Use for mutability issues. Triggers: E0596, E0499, E0502, cannot borrow as mutable, already borrowed as immutable, mut, &mut, interior mutability, Cell, RefCell, Mutex, RwLock, ε―ε˜ζ€§, ε†…ιƒ¨ε―ε˜ζ€§, ε€Ÿη”¨ε†²ηͺ"

Overview

# Mutability

> Layer 1: Language Mechanics

Core Question

Why does this data need to change, and who can change it?

Before adding interior mutability, understand:

  • Is mutation essential or accidental complexity?
  • Who should control mutation?
  • Is the mutation pattern safe?

---

Error β†’ Design Question

| Error | Don't Just Say | Ask Instead |

|-------|----------------|-------------|

| E0596 | "Add mut" | Should this really be mutable? |

| E0499 | "Split borrows" | Is the data structure right? |

| E0502 | "Separate scopes" | Why do we need both borrows? |

| RefCell panic | "Use try_borrow" | Is runtime check appropriate? |

---

Thinking Prompt

Before adding mutability:

  1. Is mutation necessary?

- Maybe transform β†’ return new value

- Maybe builder β†’ construct immutably

  1. Who controls mutation?

- External caller β†’ &mut T

- Internal logic β†’ interior mutability

- Concurrent access β†’ synchronized mutability

  1. What's the thread context?

- Single-thread β†’ Cell/RefCell

- Multi-thread β†’ Mutex/RwLock/Atomic

---

Trace Up ↑

When mutability conflicts persist:

```

E0499/E0502 (borrow conflicts)

↑ Ask: Is the data structure designed correctly?

↑ Check: m09-domain (should data be split?)

↑ Check: m07-concurrency (is async involved?)

```

| Persistent Error | Trace To | Question |

|-----------------|----------|----------|

| Repeated borrow conflicts | m09-domain | Should data be restructured? |

| RefCell in async | m07-concurrency | Is Send/Sync needed? |

| Mutex deadlocks | m07-concurrency | Is the lock design right? |

---

Trace Down ↓

From design to implementation:

```

"Need mutable access from &self"

↓ T: Copy β†’ Cell

↓ T: !Copy β†’ RefCell

"Need thread-safe mutation"

↓ Simple counters β†’ AtomicXxx

↓ Complex data β†’ Mutex or RwLock

"Need shared mutable state"

↓ Single-thread: Rc>

↓ Multi-thread: Arc>

```

---

Borrow Rules

```

At any time, you can have EITHER:

β”œβ”€ Multiple &T (immutable borrows)

└─ OR one &mut T (mutable borrow)

Never both simultaneously.

```

Quick Reference

| Pattern | Thread-Safe | Runtime Cost | Use When |

|---------|-------------|--------------|----------|

| &mut T | N/A | Zero | Exclusive mutable access |

| Cell | No | Zero | Copy types, no refs needed |

| RefCell | No | Runtime check | Non-Copy, need runtime borrow |

| Mutex | Yes | Lock contention | Thread-safe mutation |

| RwLock | Yes | Lock contention | Many readers, few writers |

| Atomic* | Yes | Minimal | Simple types (bool, usize) |

Error Code Reference

| Error | Cause | Quick Fix |

|-------|-------|-----------|

| E0596 | Borrowing immutable as mutable | Add mut or redesign |

| E0499 | Multiple mutable borrows | Restructure code flow |

| E0502 | &mut while & exists | Separate borrow scopes |

---

Interior Mutability Decision

| Scenario | Choose |

|----------|--------|

| T: Copy, single-thread | Cell |

| T: !Copy, single-thread | RefCell |

| T: Copy, multi-thread | AtomicXxx |

| T: !Copy, multi-thread | Mutex or RwLock |

| Read-heavy, multi-thread | RwLock |

| Simple flags/counters | AtomicBool, AtomicUsize |

---

Anti-Patterns

| Anti-Pattern | Why Bad | Better |

|--------------|---------|--------|

| RefCell everywhere | Runtime panics | Clear ownership design |

| Mutex for single-thread | Unnecessary overhead | RefCell |

| Ignore RefCell panic | Hard to debug | Handle or restructure |

| Lock inside hot loop | Performance killer | Batch operations |

---

Related Skills

| When | See |

|------|-----|

| Smart pointer choice | m02-resource |

| Thread safety | m07-concurrency |

| Data structure design | m09-domain |

| Anti-patterns | m15-anti-pattern |

More from this repository10

πŸͺ
actionbook-rust-skillsπŸͺMarketplace

Comprehensive Rust development assistant with meta-question routing, coding guidelines, version queries, and ecosystem support

🎯
coding-guidelines🎯Skill

Provides comprehensive Rust coding guidelines covering naming conventions, best practices, error handling, memory management, concurrency, and code style recommendations.

🎯
rust-refactor-helper🎯Skill

Performs safe Rust refactoring by analyzing symbol references, dependencies, and potential impacts using Language Server Protocol (LSP) operations.

🎯
m09-domain🎯Skill

Guides domain modeling in Rust by helping identify entities, value objects, aggregates, and their ownership patterns with domain-driven design principles.

🎯
m05-type-driven🎯Skill

Enforces compile-time type safety by preventing invalid states through type-level design techniques like newtypes, type states, and phantom types.

🎯
rust-learner🎯Skill

Retrieves and provides comprehensive Rust and crate information, including versions, features, documentation, and changelogs from authoritative sources.

🎯
m02-resource🎯Skill

Guides developers in selecting the right smart pointer and resource management strategy based on ownership, thread safety, and design constraints.

🎯
m11-ecosystem🎯Skill

Guides Rust developers in selecting, integrating, and managing ecosystem dependencies with best practices and strategic decision-making.

🎯
rust-trait-explorer🎯Skill

Explores Rust trait implementations, revealing which types implement specific traits and their implementation details using LSP.

🎯
rust-call-graph🎯Skill

Generates and visualizes Rust function call graphs using LSP, revealing function relationships and call hierarchies.