Quais são as regras exatas de auto-dereferencing em Rust?
Olá a todos! Comecei a estudar Rust recentemente e fico constantemente confuso sobre quando e como o compilador faz auto-dereferencing de referências. Por exemplo, vejo que é possível chamar o método `len()` em `&String`, embora `len()` seja definido para `String`. Ou posso passar `&i32` para uma função que espera `i32`, e o Rust faz o dereferencing automaticamente?
Aqui estão exemplos que me deixam confuso:
```rust
fn main() {
let s = String::from("hello");
let r = &s;
println!("{}", r.len()); // Funciona! Mas r é &String, não String
let x = 5;
let y = &x;
let z = *y; // Aqui eu entendo — preciso fazer dereferencing explícito
println!("{}", z);
// E aqui — por que funciona?
let v = vec![1, 2, 3];
let v_ref = &v;
println!("{}", v_ref[0]); // v_ref é &Vec, mas usamos indexação
}
```
Li sobre os traits `Deref` e `DerefMut`, mas não entendo completamente como o compilador decide quando aplicar o auto-dereferencing. Existe um conjunto claro de regras? E por que no o