

只今Rustを勉強していますが、mapがあまり理解できていなくて困っております。

Rustの説明を見ると、iterがコールされたときに渡されたクロージャーが実行される、という内容と解釈しております。少なくとも、mapはIteratior構造体に実装された関数かと思います。よって、vectorのようなものに対し、mapが実装されているのは理解できます。

しかし、理解できないのが、futures::sync::mpscにあるUnboudedReceiverに対してmap関数が実行されているコードを見たことがあります。  
下記のようなコードです。

[code]

    let (tx, rx) = futures::sync::mpsc::unbounded();
    let a = rx.map(|A| 処理 ).map(|B| 処理);
    
[/code]

以下が質問です。  
1\. rx(UnboundedReceiver)ってIteratorを実装していないはずなのですが、なぜmapがコールできるのでしょうか？  
2\. mapに渡されたクロージャーは一体いつ実行されるのでしょうか？  
3\. AやBに入る値は一体何になるのでしょうか？

あまりに、謎すぎて理解できないです。どなたかわかる方いましたら、ご回答よろしくお願いします


CC BY-SA 4.0
2018-05-12T15:30:01.113
43942
2018-05-12T17:36:09.680
2018-05-12T17:36:09.680
3060
28500
question
rust
Rustのmap関数に関して


こんにちは。

1.  
Rustではメソッドは各型毎に名前空間が分離されているのでイテレータでなくても`map`を実装可能です。

[code]

    struct YourType<T>(T);
    impl<T> YourType<T> {
      fn map(&self) {
        println!("your map");
      }
    }
    
[/code]

ここのmpscの[`UnboundedReceiver`](https://docs.rs/futures/0.2.1/futures/channel/mpsc/struct.UnboundedReceiver.html)は[`Stream`](https://docs.rs/futures/0.2.1/futures/stream/trait.Stream.html)を実装しているので([`StreamExt`](https://docs.rs/futures/0.2.1/futures/trait.StreamExt.html)経由で)`map`が使えます。

2.  
これは難しいですね。もちろん、色々にある`map`毎にタイミングが異なるのでここでは`StreamExt`での`map`の挙動について説明します。

直接的な回答は`map`の返り値である[`Map`](https://docs.rs/futures/0.2.1/futures/stream/struct.Map.html)の[`next`が呼ばれたタイミング](https://docs.rs/futures-
util/0.2.1/src/futures_util/stream/map.rs.html#61-72)です。直感的には「値を取り出す直前」です。

3.  
`StreamExt`の`Item`型です。ここでの具体例でいうと、  
`A`はチャネルから送られてくる値の型です。外見上型が書かれてませんがコンパイラが推論しているだけで、[チャネルを作った時点](https://docs.rs/futures/0.2.1/futures/channe/mpsc/fn.unbounded.html)で`Item`の型は決まっています。  
`B` は `|A|
処理`の結果の型です。これは[`Map`のへの`Stream`の定義](https://docs.rs/futures/0.2.1/futures/stream/struct.Map.html#impl-
Stream)から読み取れます。

少しドキュメントへのリンクが多いので圧倒されるかもしれませんが分からないことがあったらまた質問して下さい。


CC BY-SA 4.0
2018-05-12T16:05:22.233
43943
2018-05-12T16:05:22.233
22816
43942
answer