Retour à la leçon
Mission

Mission : un cache partage qui panique en production

Diagnostiquer un panic de RefCell double-borrow et une struct recursive qui ne compile pas, puis les corriger.

Contexte

Un cache mono-thread partage entre plusieurs composants d'une appli utilise Rc<RefCell<HashMap<String, i32>>>. Un dev a ecrit une fonction qui, en cas de cle absente, lit la valeur par defaut puis l'insere dans le meme appel :

rust
fn lire_ou_defaut(cache: &Rc<RefCell<HashMap<String, i32>>>, cle: &str) -> i32 {
    let emprunt = cache.borrow_mut();
    if let Some(v) = emprunt.get(cle) {
        *v
    } else {
        drop(emprunt);
        let mut emprunt2 = cache.borrow_mut();
        emprunt2.insert(cle.to_string(), 0);
        0
    }
}

Ce code fonctionne, mais un collegue a copie-colle un pattern similaire ailleurs sans le drop(emprunt), et l'application panique en production avec 'already borrowed: BorrowMutError'. Separement, l'equipe veut aussi modeliser une liste chainee simple et n'arrive pas a la faire compiler.