Pin projection Projection d'épinglage
La question de savoir si un champ à l'intérieur d'une struct épinglée est lui-même épinglé. La réponse de Rust : il faut choisir champ par champ, et ce choix fait partie du contrat du type.
Le contexte : un bloc async se compile en une machine à états qui peut contenir des références vers elle-même, ce qui signifie qu'elle ne doit plus bouger en mémoire une fois lancée. Rust l'exprime par un type enveloppe qui promet que ce vers quoi il pointe reste en place. Le problème apparaît quand on implémente son propre future composé d'autres futures : pour piloter un champ interne, il faut passer de la promesse faite sur toute la struct à une promesse sur ce champ en particulier. C'est permis, mais seulement si l'on s'engage en même temps à ne jamais déplacer le champ hors de la struct, à ne jamais en distribuer de référence mutable ordinaire, et à ne pas le déplacer dans son propre destructeur. Ces conditions étant faciles à oublier, la projection se fait presque toujours avec les macros de la famille pin-project plutôt qu'à la main.