|
|
|
@ -20,7 +20,7 @@ pub trait Future {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
trait 定义中包含一些的新类型和我们之前没有见过新语法,所以让我们逐步详细地解析一下这个定义。
|
|
|
|
|
trait 定义中包含一些的新类型和我们之前没有见过的新语法,所以让我们逐步详细地解析一下这个定义。
|
|
|
|
|
|
|
|
|
|
首先, `Future` 的关联类型 `Output` 表明 future 最终解析出的类型。这类似于 `Iterator` trait 的关联类型 `Item`。其次,`Future` 还有一个 `poll` 方法,其有一个特殊的 `self` 参数的 `Pin` 引用和一个 `Context` 类型的可变引用,并返回一个 `Poll<Self::Output>`。稍后我们再细说 `Pin` 和 `Context`。现在让我们专注于方法返回的 `Poll` 类型:
|
|
|
|
|
|
|
|
|
@ -197,7 +197,7 @@ pub trait Future {
|
|
|
|
|
|
|
|
|
|
</figure>
|
|
|
|
|
|
|
|
|
|
因此,如果 `String` 实现了 `!Unpin` 我们可以做一些非法的事,比如像图 17-9 这样在完全相同的内存位置将一个字符串替换为另一个字符串。这并不违反 `Pin` 的规则,因为 `String` 没有内部引用这使得它可以安全地移动!这这是为何它实现了 `Unpin` 而不是 `!Unpin` 的原因。
|
|
|
|
|
因此,如果 `String` 实现了 `!Unpin` 我们可以做一些非法的事,比如像图 17-9 这样在完全相同的内存位置将一个字符串替换为另一个字符串。这并不违反 `Pin` 的规则,因为 `String` 没有内部引用这使得它可以安全地移动!这是为何它实现了 `Unpin` 而不是 `!Unpin` 的原因。
|
|
|
|
|
|
|
|
|
|
<figure>
|
|
|
|
|
|
|
|
|
|