M03 Mutability

作者 actionbook5c40d3ad7851无许可证1.5K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库6周前更新

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, 可变性, 内部可变性, 借用冲突

AI 生成的概览

关于 Rust 可变性错误、借用冲突与内部可变性选择的参考指南。

功能
该技能是一份针对 Rust 可变性问题的教学参考。它把 E0596、E0499、E0502 等编译器错误对应到设计问题,讲解借用规则,并提供在 &mut T、Cell、RefCell、Mutex、RwLock 与原子类型之间做选择的决策表。它还列出反模式,并指向资源、并发与领域设计等相关技能。
适用场景
适用于诊断 Rust 借用检查器关于可变或不可变借用的错误,或需要决定如何通过共享引用进行修改时。也用于在单线程与线程安全的内部可变性方案之间做选择。
运行要求
无需工具、软件包或凭据;仅为说明性内容,不附带脚本。

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

ErrorDon't Just SayAsk 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
  2. Who controls mutation?

    • External caller → &mut T
    • Internal logic → interior mutability
    • Concurrent access → synchronized mutability
  3. 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 ErrorTrace ToQuestion
Repeated borrow conflictsm09-domainShould data be restructured?
RefCell in asyncm07-concurrencyIs Send/Sync needed?
Mutex deadlocksm07-concurrencyIs the lock design right?

Trace Down ↓

From design to implementation:

"Need mutable access from &self"    ↓ T: Copy → Cell<T>    ↓ T: !Copy → RefCell<T>
"Need thread-safe mutation"    ↓ Simple counters → AtomicXxx    ↓ Complex data → Mutex<T> or RwLock<T>
"Need shared mutable state"    ↓ Single-thread: Rc<RefCell<T>>    ↓ Multi-thread: Arc<Mutex<T>>

Borrow Rules

At any time, you can have EITHER:├─ Multiple &T (immutable borrows)└─ OR one &mut T (mutable borrow)
Never both simultaneously.

Quick Reference

PatternThread-SafeRuntime CostUse When
&mut TN/AZeroExclusive mutable access
Cell<T>NoZeroCopy types, no refs needed
RefCell<T>NoRuntime checkNon-Copy, need runtime borrow
Mutex<T>YesLock contentionThread-safe mutation
RwLock<T>YesLock contentionMany readers, few writers
Atomic*YesMinimalSimple types (bool, usize)

Error Code Reference

ErrorCauseQuick Fix
E0596Borrowing immutable as mutableAdd mut or redesign
E0499Multiple mutable borrowsRestructure code flow
E0502&mut while & existsSeparate borrow scopes

Interior Mutability Decision

ScenarioChoose
T: Copy, single-threadCell<T>
T: !Copy, single-threadRefCell<T>
T: Copy, multi-threadAtomicXxx
T: !Copy, multi-threadMutex<T> or RwLock<T>
Read-heavy, multi-threadRwLock<T>
Simple flags/countersAtomicBool, AtomicUsize

Anti-Patterns

Anti-PatternWhy BadBetter
RefCell everywhereRuntime panicsClear ownership design
Mutex for single-threadUnnecessary overheadRefCell
Ignore RefCell panicHard to debugHandle or restructure
Lock inside hot loopPerformance killerBatch operations

Related Skills

WhenSee
Smart pointer choicem02-resource
Thread safetym07-concurrency
Data structure designm09-domain
Anti-patternsm15-anti-pattern

来源与署名

来源:actionbook/rust-skills位于skills/m03-mutability提交5c40d3a

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架