2017-02-28 3 views
0

私は多くの場所で使用される共通のパターンとして使用されているため、抽象化する必要がある俳優があります。akkaアクターをいくつかのメッセージにどのように応答するかという点で一般的なアクターにするには?

abstract class SomeActor(.....) extends Actor with ActorLogging { 

    def receive = { 
    case Message1 => 
    case Message2 => 
    case Message3 => 
    } 
} 

今私は1つの俳優の実装がメッセージ2のためのロジックを処理し、カスタマイズする必要があると言う、何のオプション私はこれを達成するために持っていますか?

答えて

8

receiveの機能はPartialFunction[Any, Unit]なので、これを私たちの利益に利用することができます。部分関数は便利な演算子をいくつか提供します(例:PartialFunction#orElse)。

これは、親アクターでPartialFunction[Any, Unit]を定義し、子アクターで別のアクターを定義し、これらを組み合わせてreceiveを定義できることを意味します。いくつかのコードを見てみましょう!

abstract class Parent extends Actor { 
    def commonReceive: Receive = { 
    case CommonHandledMessage => 
     println("common handling") 
    case Message => 
     println("parent handling") 
    } 
} 

class Child extends Actor { 
    override val receive: Receive = specializedReceive orElse commonReceive 

    def specializedReceive: Receive = { 
    case Message => 
     println("child handling") 
    } 
} 

しかし、あなたが結果に驚くかもしれないので、これらの部分的な機能を組み合わせる方法に注意する必要があります。 orElseコンバイナを使用すると、部分的な関数は基本的に互いに積み重ねられます。これは、あなたがパターンマッチから控除できるよう、親の取り扱いは、ここで基本的に役に立たないことを意味

override val receive: Receive = { 
    case Message => 
    println("child handling") 
    case CommonHandledMessage => 
    println("common handling") 
    case Message => 
    println("parent handling") 
} 

:だから我々は上記で定義されたreceive方法のようなものに変身を想像することができます。


私はここでのポイントは、常にいくつかのパターンマッチの枝に到達することはないかもしれないので、これらの部分の機能は、組み合わせて取得する方法だと思いれると思います。この場合、基本的にがオーバーライドされたであるため、親処理は実現されません。それ以外は、部分的な機能は本当にクールです!

私は助けて欲しいと思っています:)

関連する問題