Avatar ·

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