fix misleading expression in deref.md

Declaring Target is required by Deref trait, not just for readability. For T with Deref, deref coercion occurs when the argument is a reference to T, not a value of T.
pull/841/head
Yu Jian 3 years ago committed by GitHub
parent e76b02e749
commit e6d605fc97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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 转换

Loading…
Cancel
Save