Quais são as regras exatas de auto-dereferencing em Rust?
Olá a todos! Comecei a estudar Rust recentemente e não consigo entender o auto-dereferencing. A documentação diz que o compilador desreferencia automaticamente as referências quando necessário, mas eu fico constantemente confuso.
Aqui está um exemplo simples. Tenho uma struct `Point` com um método `distance_from_origin`. Crio uma instância, depois uma referência a ela, depois uma referência à referência, e tento chamar o método:
```rust
struct Point {
x: f64,
y: f64,
}
impl Point {
fn distance_from_origin(&self) -> f64 {
(self.x.powi(2) + self.y.powi(2)).sqrt()
}
}
fn main() {
let p = Point { x: 3.0, y: 4.0 };
let r1 = &p; // &Point
let r2 = &&p; // &&Point
let r3 = &&&p; // &&&Point
println!("{}", p.distance_from_origin()); // Funciona
println!("{}", r1.distance_from_origin()); // Funciona!
println!("{}", r2.distance_from_origin()); // Funciona!!
println!("{}", r3.distance_from_origin()); // Também funciona
}