|
|
|
@ -126,7 +126,7 @@ impl<T> Deref for MyBox<T> {
|
|
|
|
|
|
|
|
|
|
很简单,当解引用 `MyBox` 智能指针时,返回元组结构体中的元素 `&self.0`,有几点要注意的:
|
|
|
|
|
|
|
|
|
|
- 为了可读性,我们声明了关联类型 `Target`
|
|
|
|
|
- 在 `Deref` 特征中声明了关联类型 `Target`,在之前章节中介绍过,关联类型主要是为了提升代码可读性
|
|
|
|
|
- `deref` 返回的是一个常规引用,可以被 `*` 进行解引用
|
|
|
|
|
|
|
|
|
|
之前报错的代码此时已能顺利编译通过。当然,标准库实现的智能指针要考虑很多边边角角情况,肯定比我们的实现要复杂。
|
|
|
|
@ -147,7 +147,7 @@ impl<T> Deref for MyBox<T> {
|
|
|
|
|
|
|
|
|
|
## 函数和方法中的隐式 Deref 转换
|
|
|
|
|
|
|
|
|
|
在函数和方法中,Rust 提供了一个极其有用的隐式转换:`Deref `转换。简单来说,当一个实现了 `Deref` 特征的值被传给函数或方法时,会根据函数参数的要求,来决定使用该值原本的类型还是 `Deref` 后的类型,例如:
|
|
|
|
|
对于函数和方法的传参,Rust 提供了一个极其有用的隐式转换:`Deref `转换。若一个类型实现了 `Deref` 特征,那它的引用在传给函数或方法时,会根据参数签名来决定是否进行隐式的 `Deref` 转换,例如:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
fn main() {
|
|
|
|
@ -162,8 +162,8 @@ fn display(s: &str) {
|
|
|
|
|
|
|
|
|
|
以上代码有几点值得注意:
|
|
|
|
|
|
|
|
|
|
- `String` 实现了 `Deref` 特征,能被转换成一个 `&str`
|
|
|
|
|
- `s` 是一个 `String` 类型,当它被传给 `display` 函数时,自动通过 `Deref` 转换成了 `&str`
|
|
|
|
|
- `String` 实现了 `Deref` 特征,可以在需要时自动被转换为 `&str` 类型
|
|
|
|
|
- `&s` 是一个 `&String` 类型,当它被传给 `display` 函数时,自动通过 `Deref` 转换成了 `&str`
|
|
|
|
|
- 必须使用 `&s` 的方式来触发 `Deref`(仅引用类型的实参才会触发自动解引用)
|
|
|
|
|
|
|
|
|
|
#### 连续的隐式 Deref 转换
|
|
|
|
|