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