Wie lauten die genauen Regeln für automatisches Dereferenzieren (auto-dereferencing) in Rust?
Hallo zusammen! Ich habe kürzlich angefangen, Rust zu lernen, und bin ständig verwirrt, wann und wie der Compiler Referenzen automatisch dereferenziert. Zum Beispiel sehe ich, dass man die Methode `len()` auf `&String` aufrufen kann, obwohl `len()` für `String` definiert ist. Oder kann man `&i32` an eine Funktion übergeben, die `i32` erwartet, und Rust dereferenziert es automatisch?
Hier sind Beispiele, die mich verwirren:
```rust
fn main() {
let s = String::from("hello");
let r = &s;
println!("{}", r.len()); // Funktioniert! Aber r ist &String, nicht String
let x = 5;
let y = &x;
let z = *y; // Hier verstehe ich — man muss explizit dereferenzieren
println!("{}", z);
// Und hier — warum funktioniert das?
let v = vec![1, 2, 3];
let v_ref = &v;
println!("{}", v_ref[0]); // v_ref ist &Vec, aber wir verwenden Indizierung
}
```
Ich habe über die Traits `Deref` und `DerefMut` gelesen, verstehe aber nicht vollständig, wie genau der Compiler entscheidet, wann automatisches Dereferenzieren angewendet wird. Gibt es einen klaren Satz von Regeln? Und warum in der o