Borrowing : les références
DébutantUne référence emprunte une valeur sans en prendre la propriété.
fn longueur(s: &String) -> usize { s.len() }
fn ajouter_point(s: &mut String) { s.push('.'); }
let mut texte = String::from("fin");
let n = longueur(&texte); // référence partagée (&)
ajouter_point(&mut texte); // référence exclusive (&mut)
La règle d'or des emprunts#
À un instant donné, on peut avoir :
- soit plusieurs références partagées
&T(lecture seule), - soit une seule référence mutable
&mut T.
Jamais les deux en même temps. Cela élimine les data races dès la compilation.
let mut v = vec![1, 2, 3];
let premier = &v[0];
// v.push(4); // ❌ erreur : v est emprunté en lecture par "premier"
println!("{premier}");
v.push(4); // ✅ "premier" n'est plus utilisé, l'emprunt est terminé
Astuce : préférez
&strà&Stringet&[T]à&Vec<T>dans les paramètres de fonction — vos fonctions acceptent alors plus de types d'entrée.