Avatar ·

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