Smart pointers courants
Débutant// Box<T> : valeur allouée sur le tas, propriétaire unique
let b = Box::new(5);
// Rc<T> : propriétaires multiples (mono-thread), compteur de références
use std::rc::Rc;
let a = Rc::new(String::from("partagé"));
let b = Rc::clone(&a);
// Arc<T> : comme Rc, mais utilisable entre threads
use std::sync::Arc;
// RefCell<T> : mutabilité intérieure, emprunts vérifiés à l'exécution
use std::cell::RefCell;
let cellule = RefCell::new(vec![1, 2]);
cellule.borrow_mut().push(3);
Cas pratique : quand le compilateur refuse un emprunt, dans l'ordre : 1) réduire la portée de la référence, 2) passer à
.clone()si le coût est acceptable, 3) repenser la structure des données, 4) en dernier recoursRc<RefCell<T>>/Arc<Mutex<T>>.