box-rc-arc


没有 Deref trait 的话,编译器只会解引用 & 引用类型。deref 方法向编译器提供了获取任何实现了 Deref trait 的类型的值,并且调用这个类型的 deref 方法来获取一个它知道如何解引用的 & 引用的能力。

当我们在示例 15-9 中输入 *y 时,Rust 事实上在底层运行了如下代码:

*(y.deref())

类似于如何使用 Deref trait 重载不可变引用的 * 运算符,Rust 提供了 DerefMut trait 用于重载可变引用的 * 运算符。

Rust 在发现类型和 trait 实现满足三种情况时会进行 Deref 强制转换:

  1. 当 T: Deref<Target=U> 时从 &T 到 &U
  2. 当 T: DerefMut<Target=U> 时从 &mut T 到 &mut U
  3. 当 T: Deref<Target=U> 时从 &mut T 到 &U