我正在学习/试验Rust,在我用这种语言找到的所有优雅中,有一个让我感到困惑并且看起来完全不合适的特点.
在进行方法调用时,Rust会自动取消引用指针.我做了一些测试来确定确切的行为:
struct X { val: i32 }
impl std::ops::Deref for X {
type Target = i32;
fn deref(&self) -> &i32 { &self.val }
}
trait M { fn m(self); }
impl M for i32 { fn m(self) { println!("i32::m()"); } }
impl M for X { fn m(self) { println!("X::m()"); } }
impl M for &X { fn m(self) { println!("&X::m()"); } }
impl M for &&X { fn m(self) { println!("&&X::m()"); } }
impl M for &&&X { …Run Code Online (Sandbox Code Playgroud) 我是Rust的新手,并试图了解引用的工作原理.在下面的代码中,当我想要进行计算时a1,i32我不必取消引用它.但随着b1这是一个Box,我必须取消对它的引用.
实际上,这两个let a2 = a1 * 2;和let a3 = *a1 * 2;的行为类似.看起来像原语中的解引用是可选的,或者编译器隐式地为我们做这件事.
fn main(){
let a = 5;
let b = Box::new(10);
let a1 = &a;
let b1 = &b;
println!("{} {}", a1, b1);
let a2 = a1 * 2;
let b2 = (**b1) * 10;
let a3 = *a1 * 2;
println!("{} {} {}", a2, a3, b2);
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释这个功能吗?