@ -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` 特征的 `Target` 类型的引用 ,例如:
```rust
fn main() {
@ -162,8 +162,8 @@ fn display(s: &str) {
以上代码有几点值得注意:
- `String` 实现了 `Deref` 特征,能被转换成一个 `& str`
- ` s` 是一个 ` String` 类型,当它被传给 `display` 函数时,自动通过 `Deref` 转换成了 `&str`
- `String` 实现了 `Deref` 特征,它的 `Target` 类型是 ` str`
- ` & s` 是一个 ` & String` 类型,当它被传给 `display` 函数时,自动通过 `Deref` 转换成了 `&str`
- 必须使用 `&s` 的方式来触发 `Deref` (仅引用类型的实参才会触发自动解引用)
#### 连续的隐式 Deref 转换