参考章节《Rust 程序设计语言》第15.2章 通过 Deref trait 将智能指针当作常规引用处理
我们可以像使用常规引用一样使用 Box<T>,请看如下代码
|
|
在之前的章节中我们说,智能指针就是一个结构体,那为什么我们可以对结构体做 * 解引用运算呢?答案就是 Deref trait
实现
Deref trait允许我们重载解引用运算符 *。通过这种方式实现Deref trait的智能指针可以被当作常规引用来对待,可以编写操作引用的代码并用于智能指针。
我们自己实现一个 Deref trait 来看看它的原理
|
|
deref方法返回值的引用,以及*(y.deref())括号外边的普通解引用仍为必须的原因在于所有权。
如果deref方法直接返回值而不是值的引用,其值(的所有权)将被移出self。
在这里以及大部分使用解引用运算符的情况下我们并不希望获取内部值的所有权。
Deref 强制转换
这是一个理论知识,了解一下对你有好处
Deref 强制转换(deref coercions)是 Rust 在函数或方法传参上的一种便利。
Deref 强制转换只能作用于实现了Deref trait的类型。
Deref 强制转换将这样一个类型的引用转换为另一个类型的引用。
让我们来看看下面这个例子
|
|
我们来看看上面这个代码
- 首先我们知道,
MyBox<T>实现了Deref trait,因此它可以通过deref()方法解引用成T类型,这一点没有疑问吧? - 此时
String和&str还是不匹配,但为什么可以呢?原因显而易见,因为String也实现了Deref trait它解引用后返回&str
这一切都是自动发生的,你不需要关心