Update ch15-02-deref.md

将复杂句式分解成短句式。
This commit is contained in:
Daniel 2021-07-18 12:35:53 +08:00 committed by GitHub
parent 63f4101d4d
commit db0fe0c209
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -153,7 +153,20 @@ Rust 将 `*` 运算符替换为先调用 `deref` 方法再进行普通解引用
### 函数和方法的隐式解引用强制多态
**解引用强制多态**_deref coercions_是 Rust 在函数或方法传参上的一种便利。其将实现了 `Deref` 的类型的引用转换为原始类型通过 `Deref` 所能够转换的类型的引用。当这种特定类型的引用作为实参传递给和形参类型不同的函数或方法时,解引用强制多态将自动发生。这时会有一系列的 `deref` 方法被调用,把我们提供的类型转换成了参数所需的类型。
**解引用强制多态**_deref coercions_是 Rust 在函数或方法传参上的一种便利。解引用强制多态只能工作在实现了Deref trait的类型上。解引用强制多态将一种类型A隐式转换为另外一种类型B的引用因为A类型实现了Deref trait并且其关联类型是B类型。比如解引用强制多态可以将&String转换为&str因为类型String实现了Deref trait并且其关联类型是str。代码如下
```rust
#[stable(feature = "rust1", since = "1.0.0")]
impl ops::Deref for String {
type Target = str;
#[inline]
fn deref(&self) -> &str {
unsafe { str::from_utf8_unchecked(&self.vec) }
}
}
```
当我们将特定类型的值的引用作为参数传递给函数或方法,但是被传递的值的引用与函数或方法中定义的参数类型不匹配时,会发生解引用强制多态。这时会有一系列的 `deref` 方法被调用,把我们提供的参数类型转换成函数或方法需要的参数类型。
解引用强制多态的加入使得 Rust 程序员编写函数和方法调用时无需增加过多显式使用 `&``*` 的引用和解引用。这个功能也使得我们可以编写更多同时作用于引用或智能指针的代码。