未だにきちんと型が読めなくて困る。
Pinning - Asynchronous Programming in Rust
To use a Future or Stream that isn't Unpin with a function that requires Unpin types, you'll first have to pin the value
!Unpin でも Box::pin で Unpin になると書いてあるのだが、ドキュメントを見るとなんか違う気がする。
impl<Ptr> Unpin for Pin<Ptr> where Ptr: Unpin,
where によれば Ptr は「 Unpin である必要」があり、 !Unpin では駄目な気がする。答えを言えば、ポインタである Box や &mut はどう考えても Unpin なわけで、 Pin<Box<...>> の形であれば Unpin なのである。同じく「 Unpin である必要」がある DerefMut と定義を比べるとわかる。
impl<Ptr> DerefMut for Pin<Ptr> where Ptr: DerefMut, <Ptr as Deref>::Target: Unpin,
こちらは Deref の Target が Unpin である必要があり、 !Unpin を Box で包んでも駄目なのである。 Deref の定義も念のためあわせて記載するとこうなる。
pub trait Deref { type Target: ?Sized; // Required method fn deref(&self) -> &Self::Target; }
型定義もまともに見ずに日本語で雑に一辺倒に「 Unpin である必要」と読んでしまうのは、勘違いの元である。
前に同じ内容を書いたときには、わかっていたんだろうなあ。