Skip to content

Instantly share code, notes, and snippets.

@amachang
Last active June 26, 2023 15:55
Show Gist options
  • Select an option

  • Save amachang/b8a0f8611f352f368246eb00dbfe0701 to your computer and use it in GitHub Desktop.

Select an option

Save amachang/b8a0f8611f352f368246eb00dbfe0701 to your computer and use it in GitHub Desktop.
[Rust] Future の poll で Pin が使われる理由

Future の poll で Pin が使われる理由

シンプルにいうと以下の式で作られる Future が !Unpin だから

let f = async { ... };

async ブロックの中では、値が await を挟んで普通に参照されたりするだろう。 つまり、参照と値がそれぞれ別の Future に属していて Future がツリー状につながっているような状態が普通である。 普通の Rust のコードだと参照されているとコンパイラが move させてくれないが、 async ブロックでできた Future が move できてしまうとその制約が破壊されてしまう。

その前提で Future の AndThen を実現する Future や All や Any を実現するコンビネータのような Future を実装することを考えてみる。

それは当然 Future を持つ Future となり、もし async ブロックから作られた Future を持てば move できてしまうとまずい(&mut 参照できないものになる)。だから全ての Future は poll で Pin<&mut Self> しとかないといけない。

外部 Future を組み合わせるような Future を作らない人には関係ない制約と認識している。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment