Stream
https://docs.rs/futures-core/0.3.21/futures_core/stream/trait.Stream.html
https://www.qovery.com/blog/a-guided-tour-of-streams-in-rust/
非同期なIteratorのようなもの
Futureと同様に poll_next で次のアイテムがあるか、まだ準備中か返す
もっと具体的に言うと、 Poll<Option<Self::Item>> を返す
Poll::Ready(Some(T)) 次の値を返せる
Poll::Ready(None) Streamの終端に達した
Poll::Pending まだ次の値を準備中
関わるcrates
futures_core
最も基本的なtrrait Stream や Future のみが入っている
async_stream
stream! try_stream! マクロを提供
yieldで値を返す stream が作れる
futures_util
AsyncRead, AsyncWrite, StreamExt 等が含まれる
安定したら futures_core に取り込まれるらしいが?
将来的に安定した機能は futures_core に統合されるものらしいです。
https://synamon.hatenablog.com/entry/rust_stream_entry#Stream-の周辺-crate
ソースは・・?
tokio-stream
tokioバックエンドによる AsyncRead, AsyncWrite, StreamExtなどが入っている
非同期イテレータがほしいだけなのになぜこんなにcratesが乱立してるんだ……castaneai.icon
非同期ランタイムがstdに入ってないからこんなことになっちゃうのか
アプリケーションとして Stream を扱う場合にはアプリケーション全体で利用する非同期バックエンドに準拠して実装をすれば良いですが、ライブラリとして Stream を扱う場合にはライブラリ利用者がどの非同期バックエンドを使うのか想定することはできません。
ライブラリ内部で特定の非同期バックエンドに依存した処理を他でしていない場合には、使用する crate を適切に選択肢、なるべく依存関係を少なく(つまりバイナリのサイズを小さく)したいでしょう。
その場合、futures_core crate のみで実装し、futuers_util、tokio_stream の具体の拡張を利用しないのも選択肢の一つです。
https://synamon.hatenablog.com/entry/rust_stream_entry#ライブラリで-Stream-を利用する際に気をつけたいこと
め、面倒くさすぎる・・・・・castaneai.icon