先日TLを眺めてた時にid:neueccさんがコードをぺちぺちと貼ってたのを見て感動したのでメモっておきます。
var p = new ReactiveProperty<int>(1, mode: ReactivePropertyMode.RaiseLatestValueOnSubscribe); p.Zip(p.Skip(1), (x, y) => new { OldValue = x, NewValue = y }) .Subscribe(t => Console.WriteLine("old: {0}, new: {1}", t.OldValue, t.NewValue)); p.Value = 10; p.Value = 100;
実行結果
old: 1, new: 10 old: 10, new: 100
ちゃんと取れるんですね・・・。Zipで自分自身の1つ先の値を待ち合わせることで古い値と新しい値をとるなんて・・・。頭やわらかい。多分こんな流のはず。
- 初期値1がOnNextに渡る
- Zipでp.Skip(1)を待ち合わせるがまだ値が取れない
- p.Value = 10でSkip(1)で待ってた所に待望の値が来る
- xに1, yに10が入るので匿名型でまとめる
- Subscribeで処理を行う(ここでは標準出力に出力)
- 10が代入されたため、新たな値がOnNextされる
- ZipでSkip(1)を待ち合わせるがまだ値が取れない
- p.Value = 100でSkip(1)で待ってた所に待望の値が来る
- xに1, yに100が入るので匿名型でまとめる
- Subscribeで処理を行う(ここでは標準出力に出力)
- 100が代入されたため、新たな値がOnNextされる
- ZipでSkip(1)を待ち合わせるがまだ値が取れない
多分、上記のようなことが起きてるのだと思います・・・。う〜ん奥が深い。