¿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