Muter à travers un & partagé — en déplaçant la vérification à l'exécution.Mutate through a shared & — by moving the check to runtime.
Le numéro précédent s'est clos sur un manque : Rc partage la possession, mais en lecture seule. La règle du Vol 1 l'impose — plusieurs &T, ou un seul &mut T, jamais les deux — et plusieurs Rc sont autant d'accès partagés. Or on a parfois besoin de muter une donnée partagée : un cache, un compteur, un nœud de graphe. La mutabilité intérieure (interior mutability) est la réponse de Rust, et elle repose sur un renversement. Elle ne supprime pas la règle « aliasing XOR mutation » — elle la maintient, mais déplace sa vérification de la compilation vers l'exécution. Cell et RefCell t'autorisent à muter derrière un &, et garantissent la sûreté en surveillant les emprunts au runtime. Le prix : ce qui était une erreur de compilation devient, en cas de faute, un panic.The previous issue closed on a gap: Rc shares ownership, but read-only. Vol 1's rule requires it — several &T, or a single &mut T, never both — and several Rcs are that many shared accesses. Yet you sometimes need to mutate shared data: a cache, a counter, a graph node. Interior mutability is Rust's answer, and it rests on a reversal. It doesn't remove the 'aliasing XOR mutation' rule — it keeps it, but moves its check from compile time to runtime. Cell and RefCell let you mutate behind a &, and guarantee safety by watching borrows at runtime. The price: what was a compile error becomes, on a fault, a panic.
use std::cell::RefCell; let compteur = RefCell::new(0); // la donnée vit derrière une RefCell let lecture = &compteur; // un accès PARTAGÉ (&), pas &mut *lecture.borrow_mut() += 1; // …et pourtant on mute À TRAVERS lui println!("{}", lecture.borrow()); // 1 // la règle « un seul écrivain » tient toujours — mais elle est vérifiée // à l'EXÉCUTION, pas à la compilation. l'enfreindre panique, au lieu de ne pas compiler.
C'est le geste de tout le volume, poussé à son terme. Le borrow checker du Vol 1 vérifie « aliasing XOR mutation » à la compilation : si tu enfreins la règle, ça ne compile pas. RefCell applique exactement la même règle, mais la vérifie à l'exécution : si tu l'enfreins, ça compile, ça tourne, et ça panique au moment précis de la double emprunte. Tu n'as pas gagné le droit de violer la règle — tu as seulement déplacé le moment où on te l'oppose. C'est un échange : plus de souplesse à l'écriture, moins de garanties statiques.It's the whole volume's move, taken to its end. Vol 1's borrow checker verifies 'aliasing XOR mutation' at compile time: break the rule, it won't compile. RefCell applies exactly the same rule, but checks it at runtime: break it, it compiles, it runs, and it panics at the precise moment of the double borrow. You haven't won the right to violate the rule — you've only moved when it's held against you. It's a trade: more flexibility when writing, fewer static guarantees.
« Ai-je vraiment besoin de muter derrière un accès partagé — ou puis-je restructurer pour garder un &mut ? » La mutabilité intérieure est un outil de dernier recours, pas un confort. Tant qu'un &mut classique est atteignable (en réorganisant qui possède quoi), il est préférable : sa sûreté est prouvée à la compilation, gratuitement. RefCell n'entre que lorsque la structure rend le &mut statique réellement impossible.'Do I truly need to mutate behind a shared access — or can I restructure to keep a &mut?' Interior mutability is a last-resort tool, not a convenience. As long as a classic &mut is reachable (by reorganizing who owns what), it's preferable: its safety is proven at compile time, for free. RefCell enters only when the structure makes the static &mut genuinely impossible.
Deux outils pour deux situations. Cell ne prête jamais de référence : on y met une valeur (set) ou on en sort une copie (get), en bloc — idéal pour des types Copy simples (un i32, un bool), sans aucun coût de suivi. RefCell, lui, prête de vraies références (borrow, borrow_mut) et doit donc surveiller les emprunts au runtime — plus puissant, mais avec le risque de panic. Copy et accès atomique → Cell ; besoin d'emprunter la donnée en place → RefCell.Two tools for two situations. Cell never lends a reference: you put a value in (set) or take a copy out (get), wholesale — ideal for simple Copy types (an i32, a bool), with no tracking cost. RefCell lends real references (borrow, borrow_mut) and so must watch borrows at runtime — more powerful, but with the panic risk. Copy and wholesale access → Cell; need to borrow the data in place → RefCell.