Avatar ·

Quelles sont les règles exactes du déréférencement automatique (auto-dereferencing) en Rust ?

Bonjour à tous ! J'ai commencé à apprendre Rust récemment et je suis constamment confus quant au moment et à la manière dont le compilateur déréférence automatiquement les références. Par exemple, je vois qu'on peut appeler la méthode `len()` sur un `&String`, alors que `len()` est définie pour `String`. Ou encore, on peut passer un `&i32` à une fonction qui attend un `i32`, et Rust le déréférence tout seul ? Voici des exemples qui me perturbent : ```rust fn main() { let s = String::from("hello"); let r = &s; println!("{}", r.len()); // Ça marche ! Mais r est un &String, pas un String let x = 5; let y = &x; let z = *y; // Là je comprends — il faut déréférencer explicitement println!("{}", z); // Et ici — pourquoi ça marche ? let v = vec![1, 2, 3]; let v_ref = &v; println!("{}", v_ref[0]); // v_ref est un &Vec, mais on utilise l'indexation } ``` J'ai lu sur les traits `Deref` et `DerefMut`, mais je ne comprends pas complètement comment le compilateur décide quand appliquer le déréférencement automatique. Existe-t-il un ensemble clair de règles ? Et pourquoi dans le