Avatar ·

¿Cuáles son las reglas exactas de auto-dereferencing en Rust?

¡Hola a todos! Empecé a aprender Rust recientemente y siempre me confundo sobre cuándo y cómo el compilador aplica auto-dereferencing a las referencias. Por ejemplo, veo que se puede llamar al método `len()` en `&String`, aunque `len()` está definido para `String`. ¿O puedo pasar un `&i32` a una función que espera `i32`, y Rust lo dereferencia automáticamente? Aquí hay ejemplos que me confunden: ```rust fn main() { let s = String::from("hello"); let r = &s; println!("{}", r.len()); // ¡Funciona! Pero r es &String, no String let x = 5; let y = &x; let z = *y; // Aquí entiendo — necesito dereferenciar explícitamente println!("{}", z); // Y aquí — ¿por qué funciona? let v = vec![1, 2, 3]; let v_ref = &v; println!("{}", v_ref[0]); // v_ref es &Vec, pero usamos indexación } ``` He leído sobre los traits `Deref` y `DerefMut`, pero no entiendo completamente cómo el compilador decide cuándo aplicar auto-dereferencing. ¿Hay un conjunto claro de reglas? ¿Y por qué en el