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
方法のようなものに変身を想像することができます。
私はここでのポイントは、常にいくつかのパターンマッチの枝に到達することはないかもしれないので、これらの部分の機能は、組み合わせて取得する方法だと思いれると思います。この場合、基本的にがオーバーライドされたであるため、親処理は実現されません。それ以外は、部分的な機能は本当にクールです!
私は助けて欲しいと思っています:)