Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rxに入門しようとしている
オノッチ(@onotchi_)
Rx(Reactive Extentions)とは?
LINQの一種
LINQ to Events
LINQ to Asynchronous(非同期)
ターゲットは?
時間
async
array
event
Time
何が出来る?
新しいイベントを合成できる
Click + Click = Double Click
MouseDown + MouseMove
+ MouseUp = Drag
Time
event
IEnumerable<T> と IObservable<T>
pull IEnumerable<T>
IEnumerator<T>
GetEnumerator
MoveNext MoveNext MoveNext
IEnumerable<T> と IObservable<T>
push
IObservable<T>
IObserver<T>
OnNext OnNext OnNext
Subscribe
様々な言語で実装
C#: Rx.NET
C#(Unity): UniRx
Java: RxJava
JavaScript: RxJS
Scala: RxScala
Clojure: RxClojure
C++: RxCpp
Ruby: Rx.r...
どれかを覚えたら( ・∀・)イイ!!
実際のソース
Unityでダブルクリック処理(※)を
Rxの有/無で記述してみる
※簡略化のため、実際はダブルマウスダウン?を処理
Not Rx
using System;
using UnityEngine;
public class DoubleClick : MonoBehaviour
{
private int _clickCount = 0;
private lo...
Rx
public void Start()
{
this.UpdateAsObservable()
.Where(_ => Input.GetMouseButtonDown(0))
.TimeInterval()
.Skip(1)
.Firs...
面白そう
Buffer
メッセージを一定個数ごとにまとめる
Throttle
一定時間以内にまとめて値が来たら落ち着くまで待ってから最後の値を取得
参考
連載:Reactive Extensions(Rx)入門
http://www.atmarkit.co.jp/fdotnet/introrx/index/
ReactiveX
http://reactivex.io/
ご静聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

Rxに入門しようとしている

2,572 views

Published on

Rxに触れて数日、現時点までに覚えたこと、感じたことをまとめました

Published in: Technology
  • Be the first to comment

Rxに入門しようとしている

  1. 1. Rxに入門しようとしている オノッチ(@onotchi_)
  2. 2. Rx(Reactive Extentions)とは? LINQの一種 LINQ to Events LINQ to Asynchronous(非同期)
  3. 3. ターゲットは? 時間 async array event Time
  4. 4. 何が出来る? 新しいイベントを合成できる Click + Click = Double Click MouseDown + MouseMove + MouseUp = Drag Time event
  5. 5. IEnumerable<T> と IObservable<T> pull IEnumerable<T> IEnumerator<T> GetEnumerator MoveNext MoveNext MoveNext
  6. 6. IEnumerable<T> と IObservable<T> push IObservable<T> IObserver<T> OnNext OnNext OnNext Subscribe
  7. 7. 様々な言語で実装 C#: Rx.NET C#(Unity): UniRx Java: RxJava JavaScript: RxJS Scala: RxScala Clojure: RxClojure C++: RxCpp Ruby: Rx.rb Python: RxPY Groovy: RxGroovy JRuby: RxJRuby Kotlin: RxKotlin Swift: RxSwift
  8. 8. どれかを覚えたら( ・∀・)イイ!!
  9. 9. 実際のソース Unityでダブルクリック処理(※)を Rxの有/無で記述してみる ※簡略化のため、実際はダブルマウスダウン?を処理
  10. 10. Not Rx using System; using UnityEngine; public class DoubleClick : MonoBehaviour { private int _clickCount = 0; private long _ticks = 0L; // Use this for initialization private void Start() { } // Update is called once per frame private void Update() { if (Input.GetMouseButtonDown(0)) { this._clickCount++; if (this._clickCount == 1) { //1回目のクリック this._ticks = DateTime.Now.Ticks; } else if (this._clickCount == 2) { //2回目のクリック if (DateTime.Now.Ticks - this._ticks <= 5000000L) //Ticksはナノ秒 500ミリ秒 = 5000000ナノ秒 { //1回目のクリックとの時間差が500ミリ秒以内の場合はダブルクリックとする Debug.Log("★★double click : Normal"); this._clickCount = 0; } else { //このクリックを1回目のクリックとみなす this._clickCount = 1; this._ticks = DateTime.Now.Ticks; } } } } } ・要メンバ変数 ・ifのネスト 等 ↓ ソースが長くなる
  11. 11. Rx public void Start() { this.UpdateAsObservable() .Where(_ => Input.GetMouseButtonDown(0)) .TimeInterval() .Skip(1) .First(x => x.Interval.TotalMilliseconds <= 500) .RepeatUntilDisable(this.gameObject) .Subscribe(x => Debug.Log("★★double click : Rx")); } ワンライナー!
  12. 12. 面白そう Buffer メッセージを一定個数ごとにまとめる Throttle 一定時間以内にまとめて値が来たら落ち着くまで待ってから最後の値を取得
  13. 13. 参考 連載:Reactive Extensions(Rx)入門 http://www.atmarkit.co.jp/fdotnet/introrx/index/ ReactiveX http://reactivex.io/
  14. 14. ご静聴ありがとうございました

×