参考:使用 Deref trait 将智能指针当作常规引用处理 - Rust 程序设计语言 中文版
参考:Treating Smart Pointers Like Regular References - The Rust Programming Language
Rust 标准库提供 Deref trait 用于重载 * 运算符。
对于普通的引用类型如 p: &T,*p 意味着获取一个临时的 T。比如字段访问操作 p.a 会被编译器自动解引用,得到 (*p).a = t.a。
对于智能指针 p: Box<T>,由于 Box 类型实现了 Deref trait,所以可以执行 *p,而且 *p 的意思是:*(p.deref()),这里 p.deref() 得到 &T,而 *(p.deref()) 开头的 * 就是对普通引用 &T 的解引用操作了。
所以也可以说,Deref trait 使得我们可以从智能指针中获得普通引用,再对普通引用执行解引用。
有了 Deref trait,我们可以像使用普通引用那样使用智能指针和 MutexGuard 等。
而由于编译器有自动解引用(自动添加 *)的功能,所以我们可以像使用普通类型 T 那样使用 T 的普通引用类型(&T)。
综合以上两步,我们可以像使用普通类型 T 那样使用包裹 T 的智能指针和 MutexGuard。
最后简单聊聊解引用强制转换 (deref coercions)
最好直接去看参考。解引用强制转换是指在使用 &T 作为函数参数且 T 实现了 Deref trait 时,编译器可以通过调用 T::deref,将原本的参数 &T 转换成 &Target(&Target 为 deref 的返回值类型),用来匹配函数期望的参数类型。