Rxの中身をほんのちょっと読んで見る。(その2)

使われているクラスなどを見ていく。

前回具象クラスがなんであるかわかったので、一番最初の疑問であった

が実際にはこちらを呼んでいる、ということがわかります。
雑に引用すると

なるほど。Select<T,TResult>クラスに潜ってみます。実際にnewしているのはSelect<TSource, TResult>クラスの内部クラスであるところの、Selectorクラスです。若干コメント入れてます。

とりあえずこのクラスの各部品を眺めて行きます。
まず返り値はIObservableでなければならないので、継承しているProducerクラスがおそらくIObservableでも実装しているのかなとおもいつつ眺めると,

ようやくSubscribeが見えてきました。Observableっぽい。プロデューサーさんが実装しているIProducerインターフェースをみると、

となっていてなるほどなるほどみたいな感じにIObservableが張り付いています。
とりあえず細かいことはさておき、次にSink<TSource, TResult>を継承している、_クラス(なんでクラス名こんななんだろうか)を見ていきます。
Sinkクラスはこんな実装になっているIObserverです

sinkって命名なんだろうと思って調べたのですが、ノードを考えるときに、矢印がでている方をsource nodeというのに対して、矢印の先のノードのことをsink nodeとかいうそうです。しりませんでした。ObservableからObserverへ、なのでsinkという命名はもっともらしいですねー。

パーツが多いのでどこから眺めるか微妙なところですが、Producerの型引数にSinkを継承しているSelector._が入っているので、Sinkから眺めていくこととします。
さらにSink<TSource, TTarget>クラスはSinkを継承しているのてSinkから見ます。

コンストラクタで与えられるobserverは後続の(今回ならSelectオペレータのあとに続くオペレータの)ものです。
Sink後続のObserverにOnNext,OnError,OnConpletedの値を流すことの他に、いろいろDisposeする機能もあるみたい。_upstreamが?という感じはありますが、Sink<TSource, TTarget>を一目瞭然です。
なので次にSink<TSource, TTarget>クラスを眺めます。
まえの_upstreamは、

から分かるように、上流のsource.Subscribeが返すIDisposableオブジェクト(source.SubscribeSafeの中はnullチェックとかいろいろはいってるけど、結局帰ってくるのはsource.Subscribeの戻り値)なので、上流のDisposeするべきものが渡されているということがわかります。名前通り。

IObserverがくっつけられるわけですが、基本的にはSinkの関数をそのまま呼び出しています。OnNextはオペレータによって様々なので、abstructのままですね。

そしてこのあたりが若干消化不良を起こします。GetForwarderは一体なんの役割が…?

よくわからんので次に行きます。Sink<TSource, TTarget>を継承しているSelectorクラスの内部クラスの_クラスを見ていきます。
再掲になりますが。

ここでようやくOnNextが実装されました。親クラスで定義されたForwardOnNextが呼ばれてOnNextがつながっていく感じがつかめます。

Selectorクラスまで戻ってきました。が、Selectorクラス内部の処理は一旦おいておいて、Selectorクラスが継承しているProducerクラスを手繰っていきます。

これも再掲になりますが。

Schedulerまわりは今回はスルーします(これは今後の課題ということで…)
safeObserver?.SetResourceはこんな具合で、

Disposable.SetSingleはこんな感じの実装。

といった具合でobserverにsink(IDisposable)を参照として持たせている感じになりますね。その他の関数はabstructなので実際の実装であるところのSelectorを見ると、Sink型をnewして、sinkのRunを呼んでいるだけだとわかります。

ということで一通り実装を眺めることに成功しましたが、個々の実装が頭の中でまだつながっていないので次回に流れを追います。

neno

都内のJK大学生。趣味はドールと一緒にお出かけして撮影すること。C++とC#が好き。C++は主にリアルタイム画像処理, C#はUnity, WPF, UWP, .NET Coreとかいろいろ。ASPとXamarin学習中。 専攻はCV。最近のおもちゃはHoloLens。

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。