ピン留めとは何か

  • ピン留めされた型は、そのメモリアドレスを変更できない(ムーブできない)
  • 指されている値は安全なコードではムーブできない

Pin<Ptr> は、ピン留めされた値へのアクセス方法を制御するために、所有権システムを利用します。言語自体を変更するのではなく、Rust の所有権システムを使ってピン留めを強制します。Pin はその内容を所有し、その安全な API のどこにもムーブを引き起こすものはありません。

これは次で説明されています

概念的には、ピン留めはデフォルトのムーブの挙動を防ぎます。

これは言語自体の変更のように見えます。

しかし、Pin ラッパーは実際には言語の基本的な部分を何も変えていません。

Pin はムーブを許す安全な API を公開していません。したがって、ビット単位のコピーを防ぐことができます。

Unsafe API では、ライブラリ作者は Unpin を実装していない型をラップできますが、同じ保証を維持しなければなりません。

Pin のドキュメントでは、「pointer types」という用語を使っています。

「pointer type」という用語は、言語におけるポインタのプリミティブ型よりもはるかに広い意味を持ちます。

「pointer type」は、ターゲットが Unpin を実装している Deref 実装型をすべてラップします。

Rust のスタイルに関する注記: このトレイト境界は、型自体ではなく ::new() コンストラクターのトレイト境界によって強制されます。