質問: rx.map(|A| 処理 ).map(|B| 処理); ``` 以下が質問です。 1. rx(UnboundedReceiver)ってIteratorを実装していないはずなのですが、なぜmapがコールできるのでしょうか? 2. mapに渡されたクロージャーは一体いつ実行されるのでしょうか? 3. AやBに入る値は一体何になるのでしょうか? あまりに、謎すぎて理解できないです。どなたかわかる方いましたら、ご回答よろしくお願いします
回答: こんにちは。 1. Rustではメソッドは各型毎に名前空間が分離されているのでイテレータでなくても`map`を実装可能です。 ``` struct YourType(T); impl YourType { fn map(&self) { println!("your map"); } } ``` ここのmpscの`UnboundedReceiver`は`Stream`を実装しているので(`StreamExt`経由で)`map`が使えます。 2. これは難しいですね。もちろん、色々にある`map`毎にタイミングが異なるのでここでは`StreamExt`での`map`の挙動について説明します。 直接的な回答は`map`の返り値である`Map`の`next`が呼ばれたタイミングです。直感的には「値を取り出す直前」です。 3. `StreamExt`の`Item`型です。ここでの具体例でいうと、 `A`はチャネルから送られてくる値の型です。外見上型が書かれてませんがコンパイラが推論しているだけで、チャネルを作った時点で`Item`の型は決まっています。 `B` は `|A| 処理`の結果の型です。これは`Map`のへの`Stream`の定義から読み取れます。 少しドキュメントへのリンクが多いので圧倒されるかもしれませんが分からないことがあったらまた質問して下さい。