Pin projection
La questione se un campo all'interno di una struct bloccata (pinned) sia a sua volta bloccato. La risposta di Rust è che bisogna scegliere campo per campo, e che la scelta fa parte del contratto del tipo.
Il contesto è che un blocco async viene compilato in una macchina a stati che può contenere riferimenti a se stessa, e quindi non deve spostarsi in memoria una volta avviata. Rust lo esprime con un tipo wrapper che promette che ciò a cui punta resti fermo. Il problema nasce quando si implementa un proprio future composto da altri future: per far avanzare un campo interno bisogna passare dalla promessa sull'intera struct a una promessa su quel singolo campo. È consentito, ma solo se ci si impegna contemporaneamente a non estrarre mai il campo, a non cederne mai un normale riferimento mutabile e a non spostarlo in un proprio distruttore. Poiché le condizioni sono facili da trascurare, la proiezione si fa quasi sempre con le macro della famiglia pin-project anziché a mano.