ピン射影
ピン留めされた構造体の中のフィールドも、それ自体ピン留めされているのかという問題。Rustの答えは、フィールドごとに選べ、その選択は型の契約の一部になる、というものだ。
背景はこうだ。async ブロックは、自分自身への参照を持ちうるステートマシンにコンパイルされる。したがって一度動き出したらメモリ上で移動してはならない。Rustは、指す先が動かないことを約束するラッパー型でそれを表現する。問題は、他のfutureを組み合わせて自前のfutureを実装するときに現れる。内側のフィールドを駆動するには、構造体全体についての約束から、そのフィールドについての約束へ移らなければならない。これは許されるが、同時に3つを誓う必要がある。そのフィールドを決して移動しないこと、通常の可変参照を渡さないこと、自前のデストラクタの中でも移動しないことである。条件は見落としやすいので、射影は手書きせず、ほぼ必ず pin-project 系のマクロで行う。