UniRx: Subject は IObserver であり IObservable でもある

Subject の定義をみると次のようになっています。

public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T>
{
}

ISubject の定義は、

public interface ISubject<TSource, TResult> : IObserver<TSource>, IObservable<TResult>
{
}

public interface ISubject<T> : ISubject<T, T>, IObserver<T>, IObservable<T>
{
}

となっています。つまり、SubjectIObserver であり、IObservable でもあります。

Subject は、IObserver であるのでストリームにデータを流す(OnNext)ことができます、。

using UniRx;
using UniRx.Diagnostics;
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        var subject = new Subject<int>();
        subject.Debug().Subscribe();

        subject.OnNext(10);
        subject.OnNext(20);
        subject.OnNext(30);
        subject.OnCompleted();        
    }
}

実行結果です。

OnSubscribe
OnNext(10)
OnNext(20)
OnNext(30)
OnCompleted()

また、Subject は、IObservable でもありますので Subscribe の引数に渡すことができます。

using UniRx;
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        var subject = new Subject<int>();
        subject.Debug().Subscribe();

        Observable.Range(1, 3).Subscribe(subject);
    }
}

実行結果です。

OnSubscribe
OnNext(1)
OnNext(2)
OnNext(3)
OnCompleted()